Перечисления в спящем режиме

Часто полезно иметь поле в DAO, значение которого исходит от перечисления Java. Типичным примером является логин DAO, в котором обычно имеется поле, которое характеризует пользователя как "НОРМАЛЬНЫЙ" или "ADMIN". В Hibernate я бы использовал следующие 2 объекта для представления этого отношения в (semi-) -стандартном виде:

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 должен поддерживать поля enum напрямую и создать дополнительную таблицу для хранения значений перечисления.

Мой вопрос: есть ли способ прямого отображения класса перечисления в Hibernate? Если нет, мой шаблон для представления перечислений достаточно хорош, или я чего-то не хватает? Какие другие модели используют люди?

Ответ 1

с использованием аннотаций спящего режима или JPA:

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

UserType - это просто стандартное перечисление java 5.

Я не могу себе представить, что это ограничивается только аннотациями, но я действительно не знаю, как это сделать с файлами hbm. Возможно, это зависит от версии, я предполагаю, но я уверен, что требуется спящий режим 3.2+.

edit: возможно в hbm, но немного беспорядочно, посмотрите на этот форум

Ответ 2

Из документации Hibernate: http://www.hibernate.org/272.html

Вы можете создать новый typedef для каждого из ваших перечислений и ссылаться на typedefs в теге свойств.

Пример сопоставления - встроенный тег <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>