82

在 DAO 中拥有一个值来自 Java 枚举的字段通常很有用。一个典型的例子是登录 DAO,您通常有一个字段将用户描述为“NORMAL”或“ADMIN”。在 Hibernate 中,我将使用以下 2 个对象以(半)类型安全的方式表示这种关系:

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 中的枚举类?如果不是,我表示枚举的模式是否足够好,或者我错过了什么?人们还使用哪些其他模式?

4

2 回答 2

111

使用休眠或 JPA 注释:

class User {
   @Enumerated(EnumType.STRING)
   UserType type
}

UserType 只是一个标准的 java 5 枚举。

我无法想象这仅限于注释,但我实际上并不知道如何使用 hbm 文件执行此操作。我猜它可能非常依赖于版本,但我很确定需要休眠 3.2+。

编辑:在 hbm 中是可能的,但有点乱,看看这个论坛帖子

于 2009-01-12T13:16:58.510 回答
14

从休眠文档: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>
于 2009-01-06T16:11:02.180 回答