Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate中的枚举_Java_Hibernate_Dao - Fatal编程技术网

Java 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

在DAO中有一个值来自Java枚举的字段通常很有用。一个典型的例子是登录DAO,其中通常有一个字段,将用户描述为“普通”或“管理员”。在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中直接映射枚举类?如果不是,我表示枚举的模式是否足够好,或者我是否遗漏了什么?人们还使用哪些其他模式

来自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
}