在DAO中包含一个字段通常很有用,其值来自Java枚举。典型示例是登录DAO,其中您通常具有将用户表征为“NORMAL”或“ADMIN”的字段。在Hibernate中,我将使用以下两个对象以(半)类型安全的方式表示这种关系:
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应该直接支持枚举字段,并创建一个额外的表来存储枚举值。
我的问题是:有没有办法在Hibernate中直接映射枚举类?如果没有,我表示枚举的模式是否足够好还是我错过了什么?人们使用了哪些其他模式?
答案 0 :(得分:110)
使用hibernate或JPA注释:
class User {
@Enumerated(EnumType.STRING)
UserType type
}
UserType只是标准的java 5枚举。
我无法想象这仅限于注释,但我实际上并不知道如何使用hbm文件。它可能是非常依赖于版本的,我猜,但我很确定需要hibernate 3.2+。
编辑:在hbm中有可能,但有点乱,看看这个forum thread
答案 1 :(得分:15)
来自Hibernate文档:http://www.hibernate.org/272.html
您可以为每个枚举创建一个新的typedef,并在属性标记中引用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>