web-dev-qa-db-fra.com

Énumérations à Hibernate

Il est souvent utile d'avoir un champ dans un DAO dont la valeur provient d'une énumération Java. Un exemple typique est un DAO de connexion où vous avez généralement un champ qui caractérise l'utilisateur comme "NORMAL" ou "ADMIN". Dans Hibernate, j'utiliserais les 2 objets suivants pour représenter cette relation de manière (semi-) sûre:

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);
}

Cela fonctionne, mais je trouve la classe UserType hideuse et nécessitant trop de bureaucratie juste pour stocker quelques valeurs. Idéalement, Hibernate devrait prendre en charge les champs d'énumération directement et créerait une table supplémentaire pour stocker les valeurs d'énumération.

Ma question est: existe-t-il un moyen de mapper directement une classe d'énumération dans Hibernate? Sinon, mon modèle de représentation des énumérations est-il assez bon ou manque-t-il quelque chose? Quels autres modèles les gens utilisent-ils?

82
Georgios Gousios

à l'aide d'annotations d'hibernation ou JPA:

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

UserType n'est qu'un standard Java 5 enum.

Je ne peux pas imaginer que cela se limite aux annotations, mais je ne sais pas vraiment comment faire cela avec les fichiers hbm. Cela dépend peut-être de la version, je suppose, mais je suis presque sûr que la mise en veille prolongée 3.2+ est requise.

edit: c'est possible dans un hbm, mais c'est un peu salissant, jetez un oeil à ça fil de discussion

110
Gareth Davis

De la documentation Hibernate: http://www.hibernate.org/272.html

Vous pouvez créer un nouveau typedef pour chacune de vos énumérations et référencer les typedefs dans la balise de propriété.

Exemple de mappage - en ligne <type> tag

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

Exemple de mappage - en utilisant <typedef>

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

  <class ...>
    <property name='suit' type='suit'/>
  </class>
15
Craig