Frage

Es ist oft nützlich, um ein Feld in einem DAO, dessen Wert aus einer Java-Enumeration kommt zu haben. Ein typisches Beispiel ist ein Login-DAO, wo Sie in der Regel ein Feld haben, die den Benutzer als „normal“ oder „ADMIN“ charakterisiert. In Hibernate, würde ich die folgenden zwei Objekte verwendet diese Beziehung in einer (semi-) typsichere Art und Weise darzustellen:

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

Dies funktioniert, aber ich finde die Usertype Klasse ungly und erfordern zu viel Bürokratie nur ein paar Werte zu speichern. Idealerweise sollte Hibernate direkt Enum Felder unterstützen und würde eine zusätzliche Tabelle erstellen, um die Aufzählungswerte zu speichern.

Meine Frage ist: Gibt es eine Möglichkeit direkt eine Enumerationsklasse in Hibernate abzubilden? Wenn nicht, ist mein Muster gut genug Aufzählungen für die Darstellung oder bin ich etwas fehlt? Welche anderen Muster verwenden Menschen?

War es hilfreich?

Lösung

mit Hibernate oder JPA Anmerkungen:

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

Usertype ist nur eine Standard-Java-5-Enumeration.

kann ich mir nicht vorstellen das ist nur nur Anmerkungen beschränkt, aber ich weiß nicht wirklich, wie diese Dateien mit hbm zu tun. Es kann sehr Version abhängig sein, vermute ich, aber ich bin mir ziemlich sicher, dass Hibernate 3.2+ erforderlich ist.

edit: es ist möglich, in einem hbm, ist aber ein wenig chaotisch, haben einen Blick auf diese

Andere Tipps

Von der Hibernate Dokumentation: http://www.hibernate.org/272.html

Sie können einen neuen typedef für jeden Ihrer Aufzählungen erstellen und die typedefs im Eigenschaftstag verweisen.

Beispiel Mapping - inline <type> Tag

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

Beispiel Mapping - mit <typedef>

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

  <class ...>
    <property name='suit' type='suit'/>
  </class>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top