A menudo es útil tener un campo en un DAO cuyo valor provenga de una enumeración de Java. Un ejemplo típico es un DAO de inicio de sesión donde normalmente tiene un campo que caracteriza al usuario como "NORMAL" o "ADMIN". En Hibernate, usaría los siguientes 2 objetos para representar esta relación de una manera (semi) segura:
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);
}
Esto funciona, pero la clase UserType me parece desagradable y requiere demasiada burocracia solo para almacenar un par de valores. Idealmente, Hibernate debería admitir campos de enumeración directamente y crearía una tabla adicional para almacenar los valores de enumeración.
Mi pregunta es: ¿Hay alguna forma de mapear directamente una clase de enumeración en Hibernate? Si no es así, ¿mi patrón para representar enumeraciones es lo suficientemente bueno o me falta algo? ¿Qué otros patrones usa la gente?
De la documentación de Hibernate: http://www.hibernate.org/272.html
Puede crear una nueva typedef para cada una de sus enumeraciones y hacer referencia a las typedefs en la etiqueta de propiedad.
Ejemplo de asignación:
<type>
etiqueta en línea<property name='suit'> <type name="EnumUserType"> <param name="enumClassName">com.company.project.Suit</param> </type> </property>
Ejemplo de mapeo: uso
<typedef>
<typedef name="suit" class='EnumUserType'> <param name="enumClassName">com.company.project.Suit</param> </typedef> <class ...> <property name='suit' type='suit'/> </class>
fuente
enumClass
lugar deenumClassName
.