Enumerazioni in Hibernate
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?
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>