Часто бывает полезно иметь поле в DAO, значение которого берется из перечисления Java. Типичным примером является вход в систему DAO, в котором обычно есть поле, характеризующее пользователя как «НОРМАЛЬНЫЙ» или «АДМИНИСТРАТОР». В 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? Если нет, достаточно ли хорош мой шаблон для представления перечислений или я что-то упускаю? Какие еще шаблоны используют люди?
Из документации 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>
источник
enumClass
вместоenumClassName
.