枚举在hibernate
在DAO中有一个值来自Java枚举的字段通常很有用。 一个典型的例子是一个loginDAO,其中通常有一个字段表示用户为“NORMAL”或“ADMIN”。 在Hibernate中,我将使用以下两个对象以(半)types安全的方式表示这种关系:
class User { String username; String passwd; UserType type; } class UserType { private enum Type {ADMIN, NORMAL}; private String type; //Setters/Getters for Hibernate public void setType(String type); public String getType(); //Setters/Getters for user public void setUserType(UserType.Type t); public UserType.Type getUserType(); public static UserType fromType(UserType.Type t); }
这是有效的,但是我发现UserType类不够用,需要太多的官僚作风来存储一些值。 理想情况下,Hibernate应直接支持枚举字段,并创build一个额外的表来存储枚举值。
我的问题是:是否有任何方法直接映射在Hibernate的枚举类? 如果没有,我的模式代表枚举足够好还是我错过了什么? 人们使用什么其他模式?
使用hibernate或JPA注释:
class User { @Enumerated(EnumType.STRING) UserType type }
UserType只是一个标准的Java 5枚举。
我无法想象这仅仅局限于注释,但实际上我不知道如何用hbm文件来做到这一点。 这可能是非常依赖版本,我猜,但我很确定,hibernate3.2 +是必需的。
编辑:这是可能的在一个hbm,但是有点凌乱,看看这个论坛主题
从Hibernate文档: http : //www.hibernate.org/272.html
您可以为每个枚举创build一个新的typedef,并在property标记中引用typedef。
示例映射 – 内联<type>
标记
<property name='suit'> <type name="EnumUserType"> <param name="enumClassName">com.company.project.Suit</param> </type> </property>
示例映射 – 使用<typedef>
<typedef name="suit" class='EnumUserType'> <param name="enumClassName">com.company.project.Suit</param> </typedef> <class ...> <property name='suit' type='suit'/> </class>
- org.hibernate.Query中的setMaxResults和setFetchSize有什么区别?
- 如何在Hibernate中设置默认值
- Hibernate错误 – QuerySyntaxException:用户未映射
- 用Hibernate + Spring进行caching – 一些问题!
- buildSessionFactory()在hibernate 4中被弃用了吗?
- 为什么不build议使用HibernateDaoSupport?
- org.hibernate.HibernateException:当“hibernate.dialect”未设置时,对DialectResolutionInfo的访问不能为null
- load()vs get()在Hibernate中的优点是什么?
- 在Hibernate 4中创build会话工厂