2012-03-23 72 views
16

假设我有这样的枚举:的Hibernate映射枚举为varchar

public enum TestEnum { EXAMPLE, FURTHER_EXAMPLE, LAST_EXAMPLE } 

有了这个映射在.hbm

<property name="testEnum" column="TEST_COLUMN"> 
    <type name="org.hibernate.type.EnumType"> 
     <param name="enumClass">p.a.c.k.TestEnum</param> 
    </type> 
</property> 

枚举发送到数据库012。我希望将这些值存储为varchar列中的EXAMPLE,FURTHER_EXAMPLELAST_EXAMPLE

如何将enum映射到varchar列?

+1

的可能的复制。 com/questions/1896666/added-an-enum-as-a-class-property-in-hbm – barsju 2012-03-23 12:57:47

回答

14

添加为EnumType的参数:如果你要存储在数据库中的varchar任何枚举的价值

<param name="type">12</param> 

这是因为12相当于java.sql.Types.VARCHAR

+3

12相当于java.sql.Types.V ARCHAR。 – bvulaj 2012-03-23 13:03:02

+2

我在浏览解决方案时看到了这个值,但认为它是枚举的默认值。这不是很具描述性,看起来像一个魔法值。谢谢! – ipavlic 2012-03-23 13:13:58

3

,请按照下列步骤操作。

  1. Hibernate提供了一个UserTpe接口。我们需要创建一个实现UserType接口的类。

    import java.io.Serializable; 
    import java.sql.PreparedStatement; 
    import java.sql.ResultSet; 
    import java.sql.SQLException; 
    import java.sql.Types; 
    
    import org.hibernate.HibernateException; 
    import org.hibernate.usertype.UserType; 
    
    public class EnumUserType<E extends Enum<E>> implements UserType { 
        private Class<E> clazz = null; 
    
        protected EnumUserType(Class<E> c) { 
         this.clazz = c; 
        } 
    
        private static final int[] SQL_TYPES = { Types.VARCHAR }; 
    
        public int[] sqlTypes() { 
          return SQL_TYPES; 
        } 
    
        public Class returnedClass() { 
         return clazz; 
        } 
    
        public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner) 
         throws HibernateException, SQLException { 
    
         String name = resultSet.getString(names[0]); 
    
         E result = null; 
         if (!resultSet.wasNull()) { 
          result = Enum.valueOf(clazz, name); 
    
         } 
         return result; 
        } 
    
        public void nullSafeSet(PreparedStatement preparedStatement, Object value, 
         int index) throws HibernateException, SQLException { 
    
         if (null == value) { 
          preparedStatement.setNull(index, Types.VARCHAR); 
         } else { 
          preparedStatement.setString(index, ((Enum) value).name()); 
         } 
        } 
    
        public Object deepCopy(Object value) throws HibernateException { 
         return value; 
        } 
    
        public boolean isMutable() { 
         return false; 
        } 
    
        public Object assemble(Serializable cached,Object owner) throws HibernateException { 
         return cached; 
        } 
    
        public Serializable disassemble(Object value) throws HibernateException { 
         return (Serializable) value; 
        } 
    
        public Object replace(Object original, Object target, Object owner) 
         throws HibernateException { 
         return original; 
        } 
    
        public int hashCode(Object x) throws HibernateException { 
         return x.hashCode(); 
        } 
    
        public boolean equals(Object x, Object y) throws HibernateException { 
         if (x == y) 
          return true; 
         if (null == x || null == y) 
          return false; 
         return x.equals(y); 
        } 
    } 
    
  2. 假设我有一个EncryptionStatus Enum。

    import java.io.Serializable; 
    import com.google.gwt.user.client.rpc.IsSerializable; 
    
    public enum EncryptionStatus implements IsSerializable, Serializable { 
        PLAIN, HASH, RE_HASH, SUPER_HASH, SUPER_REHASH, OPEN, ENCRYPT, RE_ENCRYPT 
    } 
    
  3. 我们需要创建一个扩展我们创建的EnumUserType>的类。

    public class EncryptionStatusType extends EnumUserType<EncryptionStatus>{ 
    
        public EncryptionStatusType() {  
         super(EncryptionStatus.class); 
        } 
    } 
    
  4. 现在我们需要映射上述hbm.xml文件中创建的类中枚举映射代替其存储枚举值在数据库中的VARCHAR。例如,

<property name="secureStatus" type="com.nextenders.facadeimplementation.util.userenum.EncryptionStatusType" column="secure_status" />

15

这也许是更具描述性的

<param name="useNamed">true</param> 
+0

'useNamed'在4.2.0以来就存在于hibernate中了.Final甚至在'3.1beta9'中也有'type' [link](http://grepcode.com/file/repo1.maven.org/maven2/org。 hibernate/hibernate-core/4.2.0.Final/org/hibernate/type/EnumType.java /) [link](http://grepcode.com/file/repo1.maven.org/maven2/org.hibernate/ hibernate-annotations/3.1beta9/org/hibernate/type/EnumType.java /) – 2017-01-16 11:30:43

6

您可以使用注释是这样的:HTTP://计算器

public class MyClass { 
    TestEnum testEnum; 
    @column(name="TEST_COLUMN") 
    @Enumerated(EnumType.STRING) 
    public TestEnum getTestEnum(){ 
     this.testEnum; 
    } 
} 
+0

问题在于hbm映射,而不是注释。 – jschreiner 2017-03-08 10:28:44