Java Hibernate中的枚举
在DAO中有一个值来自Java枚举的字段通常很有用。一个典型的例子是登录DAO,其中通常有一个字段,将用户描述为“普通”或“管理员”。在Hibernate中,我将使用以下两个对象以(半)类型安全的方式表示这种关系:Java Hibernate中的枚举,java,hibernate,dao,Java,Hibernate,Dao,在DAO中有一个值来自Java枚举的字段通常很有用。一个典型的例子是登录DAO,其中通常有一个字段,将用户描述为“普通”或“管理员”。在Hibernate中,我将使用以下两个对象以(半)类型安全的方式表示这种关系: class User { String username; String passwd; UserType type; } class UserType { private enum Type {ADMIN, NORMAL}; private
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中直接映射枚举类?如果不是,我表示枚举的模式是否足够好,或者我是否遗漏了什么?人们还使用哪些其他模式 来自Hibernate文档: 您可以为每个枚举创建一个新的typedef,并在属性标记中引用typedef 示例映射-内联
标记
<property name='suit'>
<type name="EnumUserType">
<param name="enumClassName">com.company.project.Suit</param>
</type>
</property>
com.company.project.Suit
示例映射-使用
com.company.project.Suit
使用hibernate或JPA注释:
class User {
@Enumerated(EnumType.STRING)
UserType type
}
UserType只是一个标准的Java5枚举
我无法想象这仅仅局限于注释,但我实际上不知道如何使用hbm文件来实现这一点。我猜它可能非常依赖于版本,但我非常确定Hibernate3.2+是必需的
编辑:这在hbm中是可能的,但是有点凌乱,看看这个谢谢。我已经意识到了这个解决方案。问题是,它要求所有枚举都使用hibernate内部类型,如果像我的例子中那样将DAO用作DTO,则可能会导致问题。这里实际上描述了一个更好的解决方案:请注意,在较新的版本中,参数名是
enumClass
,而不是enumClassName
。可以@Enumerated(EnumType.ORDINAL)哪个映射到int更有效?可能效率更高,但我认为不能测量实际系统中的差异。如果只执行@Enumerated,则EnumType.ORDINAL实际上是默认值。我认为大多数人(特别是DBA)倾向于选择数据库中的枚举名。我如何更改这些枚举的列长度?我尝试添加列批注,但没有成功?您需要将其作为另一个问题来提问。使用字符串而不是序号,因为它允许您向枚举添加其他元素,而不考虑顺序。
class User {
@Enumerated(EnumType.STRING)
UserType type
}