Question

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 par & "; NORMAL &"; ou " ADMIN " ;. Dans Hibernate, j’utiliserais les 2 objets suivants pour représenter cette relation de manière (semi-) typée:

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 malpropre et nécessitant trop de bureaucratie rien que pour stocker quelques valeurs. Idéalement, Hibernate devrait prendre en charge directement les champs enum et créer un tableau supplémentaire pour stocker les valeurs d’énumération.

Ma question est la suivante: 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?

Était-ce utile?

La solution

utilisant des annotations hibernation ou JPA:

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

UserType est simplement une énumération java 5 standard.

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

edit: c'est possible dans un hbm, mais c'est un peu brouillon, jetez un oeil à ceci sujet du forum

Autres conseils

Dans 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 property.

Exemple de mappage - balise <type> en ligne

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

Exemple de mappage - avec <typedef>

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

  <class ...>
    <property name='suit' type='suit'/>
  </class>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top