Вопрос
Часто бывает полезно иметь поле в DAO, значение которого берется из перечисления Java. Типичным примером является DAO для входа, где у вас обычно есть поле, которое характеризует пользователя как & Quot; NORMAL & Quot; или " 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 должен поддерживать поля enum напрямую и создавать дополнительную таблицу для хранения значений перечисления.
Мой вопрос: есть ли способ напрямую отобразить класс перечисления в Hibernate? Если нет, достаточно ли хорош мой шаблон для представления перечислений или я что-то упустил? Какие еще шаблоны используют люди? Р>
Решение
используя аннотации hibernate или JPA:
class User {
@Enumerated(EnumType.STRING)
UserType type
}
UserType - это просто стандартное перечисление java 5. Р>
Я не могу себе представить, что это ограничивается только аннотациями, но на самом деле я не знаю, как это сделать с файлами hbm. Я полагаю, это может зависеть от версии, но я почти уверен, что требуется спящий режим 3.2+.
edit: это возможно в hbm, но немного сумбурно, взгляните на этот ветка форума
Другие советы
Из документации по 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>