Domanda

È spesso utile disporre di un campo in un DAO il cui valore provenga da un'enumerazione Java. Un tipico esempio è un DAO di accesso in cui di solito si dispone di un campo che caratterizza l'utente come & Quot; NORMAL & Quot; oppure " ADMIN " ;. In Hibernate, utilizzerei i seguenti 2 oggetti per rappresentare questa relazione in un modo (semi) typesafe:

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

Funziona, ma trovo la classe UserType ungly e che richiede troppa burocrazia solo per memorizzare un paio di valori. Idealmente, Hibernate dovrebbe supportare direttamente i campi enum e creare una tabella aggiuntiva per memorizzare i valori di enumerazione.

La mia domanda è: esiste un modo per mappare direttamente una classe di enumerazione in Hibernate? In caso contrario, il mio modello di rappresentazione delle enumerazioni è abbastanza buono o mi sto perdendo qualcosa? Quali altri schemi usano le persone?

È stato utile?

Soluzione

utilizzando l'ibernazione o le annotazioni JPA:

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

UserType è solo un enum java 5 standard.

Non riesco a immaginare che questo sia solo limitato alle annotazioni, ma in realtà non so come farlo con i file hbm. Potrebbe dipendere molto dalla versione, immagino, ma sono abbastanza sicuro che sia richiesto l'ibernazione 3.2+.

modifica: è possibile in un hbm, ma è un po 'disordinato, dai un'occhiata a questo thread del forum

Altri suggerimenti

Dalla documentazione di Hibernate: http://www.hibernate.org/272.html

Puoi creare un nuovo typedef per ciascuno dei tuoi enumeratori e fare riferimento ai typedef nel tag proprietà.

Esempio di mappatura: in linea <type> tag

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

Esempio di mappatura - usando <typedef>

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

  <class ...>
    <property name='suit' type='suit'/>
  </class>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top