Pregunta

A menudo es útil tener un campo en un DAO cuyo valor proviene de una enumeración de Java. Un ejemplo típico es un DAO de inicio de sesión donde generalmente tiene un campo que caracteriza al usuario como & Quot; NORMAL & Quot; o " ADMIN " ;. En Hibernate, usaría los siguientes 2 objetos para representar esta relación de una manera (semi) segura de tipos:

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 encuentro que la clase UserType es desagradable y requiere demasiada burocracia solo para almacenar un par de valores. Idealmente, Hibernate debería admitir campos enum directamente y crearía una tabla adicional para almacenar los valores de enumeración.

Mi pregunta es: ¿Hay alguna forma de asignar directamente una clase de enumeración en Hibernate? Si no, ¿mi patrón para representar enumeraciones es lo suficientemente bueno o me falta algo? ¿Qué otros patrones usan las personas?

¿Fue útil?

Solución

utilizando anotaciones de hibernación o JPA:

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

UserType es solo una enumeración estándar de Java 5.

No puedo imaginar que esto se limite solo a anotaciones, pero en realidad no sé cómo hacer esto con archivos hbm. Supongo que puede depender mucho de la versión, pero estoy bastante seguro de que se requiere hibernate 3.2+.

editar: es posible en un hbm, pero es un poco desordenado, eche un vistazo a esto hilo del foro

Otros consejos

De la documentación de Hibernate: http://www.hibernate.org/272.html

Puede crear un nuevo typedef para cada una de sus enumeraciones y hacer referencia a los typedefs en la etiqueta de propiedad.

Asignación de ejemplo: etiqueta <type> en línea

  <property name='suit'>
    <type name="EnumUserType">
      <param name="enumClassName">com.company.project.Suit</param>
    </type>
  </property>

Ejemplo de mapeo - usando <typedef>

  <typedef name="suit" class='EnumUserType'>
      <param name="enumClassName">com.company.project.Suit</param>
  </typedef>

  <class ...>
    <property name='suit' type='suit'/>
  </class>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top