Enum in Hibernate, persistant comme un enum

Dans ma firebase database MySQL, il y a la colonne “gender enum (” male “,” female “)”

J’ai créé mon enum “com.mydomain.myapp.enums.Gender” et, dans mon entité Person , je suis défini par “Genre, genre”.

Maintenant, je voudrais garder le type enum dans ma firebase database MySQL, mais quand je lance mon application, je reçois:

Type de colonne incorrect dans MyApp.Person pour la colonne Gender. Trouvé: enum, attendu: entier

Pourquoi est-ce? Ce serait l’équivalent comme si j’avais annoté mon “Genre” avec “@Enumerated (EnumType.ORDINAL)”, ce que je n’ai pas. EnumType ne semble pouvoir être que ORDINAL ou STRING, alors comment puis-je spécifier qu’il doit traiter le champ comme une enum, pas comme un int? (Non pas qu’il y ait beaucoup de différence, mais suffisamment pour que ça s’énerve.)

D’après ce que je comprends, le type MySQL enum est très propriétaire et n’est pas bien pris en charge par Hibernate, voir ce commentaire de Gavin King (ce problème est un peu différent mais ce n’est pas la partie importante).

Donc, je pense en fait que vous devrez utiliser votre propre UsereType et je vous recommande d’utiliser la version flexible de Java 5 EnumUserType (voir Java 5 Enums Persistence avec Hibernate d’Appfuse par exemple).

Personnellement, je voudrais juste oublier l’idée d’utiliser MySQL enum, je ne suis pas convaincu que les “avantages” en valent la peine (voir cette réponse pour plus de détails).

Si vous donnez à Hibernate une définition de colonne, il n’essaiera pas de le deviner:

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

Si vous ne comptez pas sur Hibernate pour générer votre schéma pour une raison quelconque, vous n’avez même pas à fournir de vraies valeurs pour columnDefinition. De cette façon, vous supprimez une instance où vous devez conserver les valeurs synchronisées. Gardez simplement votre enum Java et votre script Liquibase ou SQL synchronisés:

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

Essayez d’utiliser @Enumerated (EnumType.STRING) et définissez votre enum comme ceci

 enum Gender { male, female } 

Notez les valeurs minuscules.

Cela fonctionnera au moins avec les colonnes VARCHAR. Il va stocker enum comme chaîne «mâle» ou «femelle».

je ne sais pas pourquoi il ne se trouve pas dans la documentation d’Hibernate mais vous pouvez le faire

   com.abMyEnum 12    

Pas pour ce cas, mais si quelqu’un utilise le mappage XML:

   com.myorg.persistence.data.State   

Le type de colonne de firebase database doit être numérique, par exemple tinyint sur un mysql pour permettre la lecture des valeurs ordinales.