Enum Type 만들기
클래스 구현하기.
- EnhancedUserType와 ParameterizedType 인터페이스를 구현한다.
private Class<Enum> enumClass;public void setParameterValues(Properties parameters) {
String enumClassName =
parameters.getProperty(“enumClassname”);
try {
enumClass = ReflectHelper.classForName(enumClassName);
} catch (ClassNotFoundException cnfe) {
throw new
HibernateException(“Enum class not found”, cnfe);
}
}public Class returnedClass() {
return enumClass;
}public Object fromXMLString(String xmlValue) {
return Enum.valueOf(enumClass, xmlValue);
}public String objectToSQLString(Object value) {
return ”’ + ( (Enum) value ).name() + ”’;
}public String toXMLString(Object value) {
return ( (Enum) value ).name();
}public Object nullSafeGet(ResultSet rs,
String[] names,
Object owner)
throws SQLException {
String name = rs.getString( names[0] );
return rs.wasNull() ? null : Enum.valueOf(enumClass, name);
}public void nullSafeSet(PreparedStatement st,
Object value,
int index)
throws SQLException {
if (value == null) {
st.setNull(index, Hibernate.STRING.sqlType());
} else {
st.setString( index, ( (Enum) value ).name() );
}
}
- setParameterValues()는 클래스 이름 가져와서 Class 변수에 세팅한다.
- fromXMLString(), objectToSQLString(), toXMLString()는 XML과 Enum의 value를 맵핑한다.
- nullSafeGet()는 DB에서 value를 읽은 다음 Enum으로 반환한다.
- nullSafeSet()는 Enum에서 DB로 저장할 value를 뽑아낸다.
맵핑하기
- JPA의 경우 커스텀 타입 클래스 만들지 않고도 String으로 저장하거나, 선택된 Enum의 value를 저장할 수 있다.
public class Comment {
…
@Enumerated(EnumType.STRING)
@Column(name = “RATING”, nullable = false, updatable = false)
private Rating rating;
…
}
쿼리 작성하기
- 다음과 같이 쿼리를 작성할 수 있다.
Query q =
session.createQuery(
“from Comment c where c.rating = auction.model.Rating.BAD”
);
- c.rating의 rating은 DB 컬럼의 이름이 아니라 객체의 속성이름이다.
“from Member m where m.memberType = ‘” + MemberType.ADMIN + “‘”
“from Member m where m.memberType = chapter5.customType.example.MemberType.ADMIN”