사용자 도구

사이트 도구


java:jpa:enum

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
java:jpa:enum [2014/10/01 18:21]
kwon37xi
java:jpa:enum [2014/10/02 16:40]
kwon37xi
줄 1: 줄 1:
-====== JPA 2.0 Enum Mapping with Hibernate ====== +====== JPA Enum ====== 
-  * [[http://appfuse.org/display/APF/Java+5+Enums+Persistence+with+Hibernate|Java 5 Enums Persistence with Hibernate]]+  * 기본적으로 Enum의 ''name()''이 문자열로 DB에 저장. 
 +  * ORDINAL은 사용하지 말 것. Enum의 순서 변경시 심각한 마이그레이션 이슈를 일으킴.
   * JPA 2.0에서는 ENUM값을 자유롭게 변경해서 넣을 때 문제가 있다. JPA 2.1에서는 Converter가 있어서 관계 없음.   * JPA 2.0에서는 ENUM값을 자유롭게 변경해서 넣을 때 문제가 있다. JPA 2.1에서는 Converter가 있어서 관계 없음.
-  * [[https://developer.jboss.org/wiki/Java5EnumUserType|Java 5 EnumUserType]] +  * JPA 2.0에서는 [[java:hibernate:usertype:generic_enum|Hibernate Generic Enum UserType]] 사용.
-  * [[http://stackoverflow.com/questions/4744179/java-lang-verifyerror-on-hibernate-specific-usertype/6231710#6231710|java.lang.verifyError on hibernate specific usertype for Hibernate 4 - Stack Overflow]] +
-====== Hibernate UserType ====== +
-for Hibernate 4 +
-<code java> +
-package org.appfuse.tutorial.commons.hibernate; +
-  +
-import java.io.Serializable; +
-import java.lang.reflect.Method; +
-import java.sql.PreparedStatement; +
-import java.sql.ResultSet; +
-import java.sql.SQLException; +
-import java.util.Properties; +
-  +
-import org.hibernate.HibernateException; +
-import org.hibernate.type.NullableType; +
-import org.hibernate.type.TypeFactory; +
-import org.hibernate.usertype.ParameterizedType; +
-import org.hibernate.usertype.UserType; +
-  +
-  +
-public class GenericEnumUserType implements UserType, ParameterizedType { +
-    private static final String DEFAULT_IDENTIFIER_METHOD_NAME = "name"; +
-    private static final String DEFAULT_VALUE_OF_METHOD_NAME = "valueOf"; +
-  +
-    private Class<? extends Enum> enumClass; +
-    private Class<?> identifierType; +
-    private Method identifierMethod; +
-    private Method valueOfMethod; +
-    private NullableType type; +
-    private int[sqlTypes; +
-  +
-    public void setParameterValues(Properties parameters) { +
-        String enumClassName = parameters.getProperty("enumClass"); +
-        try { +
-            enumClass = Class.forName(enumClassName).asSubclass(Enum.class); +
-        } catch (ClassNotFoundException cfne) { +
-            throw new HibernateException("Enum class not found", cfne); +
-        } +
-  +
-        String identifierMethodName = parameters.getProperty("identifierMethod", DEFAULT_IDENTIFIER_METHOD_NAME); +
-  +
-        try { +
-            identifierMethod = enumClass.getMethod(identifierMethodName, new Class[0]); +
-            identifierType = identifierMethod.getReturnType(); +
-        } catch (Exception e) { +
-            throw new HibernateException("Failed to obtain identifier method", e); +
-        } +
-  +
-        type = (NullableType) TypeFactory.basic(identifierType.getName()); +
-  +
-        if (type == null) +
-            throw new HibernateException("Unsupported identifier type " + identifierType.getName()); +
-  +
-        sqlTypes = new int[] { type.sqlType() }; +
-  +
-        String valueOfMethodName = parameters.getProperty("valueOfMethod", DEFAULT_VALUE_OF_METHOD_NAME); +
-  +
-        try { +
-            valueOfMethod = enumClass.getMethod(valueOfMethodName, new Class[] { identifierType }); +
-        } catch (Exception e) { +
-            throw new HibernateException("Failed to obtain valueOf method", e); +
-        } +
-    } +
-  +
-    public Class returnedClass() { +
-        return enumClass; +
-    } +
-  +
-    public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {  +
-        Object identifier = type.get(rs, names[0]); +
-        if (identifier == null) { +
-            return null; +
-        } +
-          +
-        try { +
-            return valueOfMethod.invoke(enumClass, new Object[] { identifier }); +
-        } catch (Exception e) { +
-            throw new HibernateException("Exception while invoking valueOf method '" + valueOfMethod.getName() + "' of " + +
-                    "enumeration class '" + enumClass + "'", e); +
-        } +
-    } +
-  +
-    public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException { +
-        try { +
-            if (value == null) { +
-                st.setNull(index, type.sqlType()); +
-            } else { +
-                Object identifier = identifierMethod.invoke(value, new Object[0]); +
-                type.set(st, identifier, index); +
-            } +
-        } catch (Exception e) { +
-            throw new HibernateException("Exception while invoking identifierMethod '" + identifierMethod.getName() + "' of " + +
-                    "enumeration class '" + enumClass + "'", e); +
-        } +
-    } +
-  +
-    public int[] sqlTypes() { +
-        return sqlTypes; +
-    } +
-  +
-    public Object assemble(Serializable cached, Object owner) throws HibernateException { +
-        return cached; +
-    } +
-  +
-    public Object deepCopy(Object value) throws HibernateException { +
-        return value; +
-    } +
-  +
-    public Serializable disassemble(Object value) throws HibernateException { +
-        return (Serializable) value; +
-    } +
-  +
-    public boolean equals(Object x, Object y) throws HibernateException { +
-        return x == y; +
-    } +
-  +
-    public int hashCode(Object x) throws HibernateException { +
-        return x.hashCode(); +
-    } +
-  +
-    public boolean isMutable() { +
-        return false; +
-    } +
-  +
-    public Object replace(Object original, Object target, Object owner) throws HibernateException { +
-        return original; +
-    } +
-+
-</code> +
- +
-===== Example ===== +
-<code java> +
-package org.appfuse.tutorial.model; +
-  +
-@Entity +
-@Table(name="t_person"+
-public class Person extends BaseObject { +
-  +
-   // Enumerations --------------------------- +
-     public enum Sex{ +
-  +
-      MALE(1), +
-      FEMALE(2); +
-  +
-      private int value; +
-  +
-      Sex(int value) { +
-          this.value = value; +
-      } +
-  +
-      // the identifierMethod +
-      public int toInt() { +
-        return value; +
-      } +
-  +
-       // the valueOfMethod +
-       public  static Sex fromInt(int value) {    +
-           switch(value) { +
-               case 1: return MALE; +
-               case 2: return FEMALE; +
-               default: +
-                       return UNKNOW; +
-           } +
-      } +
-       +
-      public String toString() { +
-        switch(this) { +
-          case MALE: +
-              return "Male"; +
-          case FEMALE: +
-              return "Female"; +
-        } +
-      } +
-    } +
-  +
-    // Attributes --------------------------- +
-  +
-    @Id +
-    @Column(name= "person_id"+
-    @GeneratedValue(strategy = GenerationType.AUTO) +
-    private Long id; +
-  +
-  +
-    @Column(name="person_firstname", length = 50, nullable = false) +
-    private String firstName; +
-  +
-  +
-    @Column(name="person_lastname", length = 50, nullable = false) +
-    private String lastName; +
-  +
-     +
-    @Column(name= "person_sex", columnDefinition="integer", nullable = true) +
-    @Type( +
-        type = "org.appfuse.tutorial.commons.hibernate.GenericEnumUserType", +
-        parameters = { +
-                @Parameter( +
-                    name  = "enumClass",                      +
-                    value = "org.appfuse.tutorial.model.Person$Sex"), +
-                @Parameter( +
-                    name  = "identifierMethod", +
-                    value = "toInt"), +
-                @Parameter( +
-                    name  = "valueOfMethod", +
-                    value = "fromInt"+
-                } +
-    ) +
-    private Sex sex; +
-  +
-  +
-    /* +
-     * Getters and Setters ... +
-     */ +
-+
-</code>+
java/jpa/enum.txt · 마지막으로 수정됨: 2014/10/02 16:40 저자 kwon37xi