클래스 구현하기.

  • 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 '
  • 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"
' + ( (Enum) value ).name() + '