Enum in Hibernate, persistente come enum

Nel mio database MySQL, c’è la colonna “gender enum (‘male’, ‘female’)”

Ho creato il mio enum “com.mydomain.myapp.enums.Gender”, e nella mia quadro Person sono definito “genere di genere”.

Ora vorrei mantenere il tipo di enum nel mio database MySQL, ma quando lancio la mia applicazione ottengo:

Tipo di colonna errato in MyApp.Person per colonna Gender. Trovato: enum, atteso: numero intero

Perchè è questo? Questo sarebbe l’equivalente come se avessi annotato il mio “genere di genere” con “@Enumerated (EnumType.ORDINAL)”, che non ho. EnumType sembra essere solo ORDINAL o STRING, quindi come faccio a specificare che dovrebbe trattare il campo come enum, non come int? (non che ci sia molta differenza, ma abbastanza da farlo arrabbiare.)

La mia comprensione è che il tipo di enum di MySQL è molto proprietario e non ben supportato da Hibernate, vedere questo commento di Gavin King (questo problema correlato è un po ‘diverso ma non è la parte importante).

Quindi, in realtà penso che dovrai usare il tuo UsereType e ti consiglio di utilizzare la soluzione flessibile: la versione funzionante di Java 5 EnumUserType (vedi Persistenza di Windows 5 Enum di Appfuse con Hibernate per un esempio).

Personalmente, dimenticherò l’idea di usare enum MySQL, non sono convinto che i “benefici” valgano (vedi questa risposta per maggiori dettagli).

Se si dà a Hibernate una definizione di colonna, non tenterà di indovinarne una:

 @Column(columnDefinition = "enum('MALE','FEMALE')") @Enumerated(EnumType.STRING) private Gender gender; 

Se non ci si basa su Hibernate per generare lo schema per qualsiasi motivo, non è nemmeno necessario fornire valori reali per columnDefinition. In questo modo, rimuovi un’istanza in cui è necessario mantenere i valori sincronizzati. Tieni semplicemente sincronizzati il ​​tuo enum Java e il tuo script Liquibase o SQL:

 @Column(columnDefinition = "enum('DUMMY')") @Enumerated(EnumType.STRING) private ManyValuedEnum manyValuedEnum; 

Prova a usare @Enumerated (EnumType.STRING) e definisci il tuo enum in questo modo

 enum Gender { male, female } 

Nota i valori in lettere minuscole.

Questo funzionerà almeno con le colonne VARCHAR. Memorizzerà enum come stringa “maschio” o “femmina”.

non sono sicuro del motivo per cui non si trova nella documentazione di Hibernate, ma puoi farlo

   com.abMyEnum 12    

Non per questo caso, ma se qualcuno sta usando la mapping XML:

   com.myorg.persistence.data.State   

Il tipo di colonna del database deve essere numerico, ad esempio tinyint su un mysql per rendere ansible la lettura dei valori ordinali.