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”

Leave a Reply

Your email address will not be published. Required fields are marked *