Hibernate/JPA, bug - la Non-reconnaissance de certaines chaînes dans un enum
J'ai un enum dans une classe, cartographié par Hibernate. L'un des champs mappés est enum type qui a l'une des valeurs suivantes OK, NOK ou SIESTE. NOK ou SIESTE fonctionne comme prévu, mais quand le champ de la classe est définie sur 'OK', Hibernate ne parvient pas à la carte et récupérer la valeur, qui est mis à null:
java.lang.IllegalArgumentException: Unknown name value for enum class com.a.b.c.d.Class$Status: OK
at org.hibernate.type.EnumType.nullSafeGet(EnumType.java:113)
La classe a:
private Status status;
@JoinColumn(name = "STATUS")
@Enumerated(EnumType.STRING)
public Status getStatus() {
return status;
}
public enum Status {
OK, NOK, NAP;
}
Si je change OK à OK2, il fonctionne correctement. _OK fonctionne également.
Pour autant que je suis concerné " OK " n'est pas un nom réservé (comme dans ce cas où le gars utilise nouveau), car il compile correctement.
Merci!
Mise à JOUR:
Up "jusqu'à maintenant, ce que j'ai fait pour résoudre le problème est de modifier l'enum et le magasin "_OK "dans la base de données au lieu de" OK", comme indiqué ci-dessus. Pas très gentil de la solution, mais ça marche au moins.
public enum Status {
_OK("OK"),
NOK("NOK"),
NAP("NAP");
private String desc;
private Status(String desc){
this.desc = desc;
}
public String getDesc(){
return desc;
}
}
RAPPORT DE BUG:
Un rapport de bug a été rempli.
- Vos différents tests semble bien pensé. Il semble que vous avez un bug! Veuillez signaler via hibernate jira, y compris votre exemple de code.
- J'ai simplement répondu à une question similaire, stackoverflow.com/questions/6419783/enum-mapping-in-hibernate/...
- Je suis à l'aide de Hibernate 3.4.0.GA et qui pourrait être le problème. Mais, j'ai besoin d'être prudent, si je veux mettre à jour 3.5.6 ou (3.6.5, la duré finale) parce que c'est situé sur une Maven pom.xml qui est utilisé dans de nombreux produits. Donc, je dois faire quelques tests avant que. Mais merci pour les conseils. Je pourrais faire comme @Bohème dit et remplir un bogue demande.
- FWIW, j'ai essayé votre exemple avec DataNucleus JPA, les objets ont persisté bien avec toutes les valeurs et tous lu dans ok.
- même problème avec 3.6.5.Final. Je pense que le problème est dans hibernate annotations qui n'a pas changé de 3.4.0.GA quand j'ai changé la version d'hibernate sur le POM.xml. Vais essayer ça avant de le signaler.
Vous devez vous connecter pour publier un commentaire.
Le problème que vous avez est que dans votre base de données vous avez des valeurs autres que OK, NOK, la SIESTE et quand vous êtes à récupérer les documents, c'est quand vous obtenez l'exception, et non lorsque vous êtes persistant.
De votre Exception
com.a.b.c.d.Class$Status: OK2
il semble que votre base de données qui a de la valeur et donc lejava.lang.IllegalArgumentException: Unknown name value for enum class
exception.Vérifier votre table pour des valeurs non valides, retirez les corriger, et essayez à nouveau.
java.lang.IllegalArgumentException: Unknown name value for enum class com.a.b.c.d.Class$Status: OK at org.hibernate.type.EnumType.nullSafeGet(EnumType.java:113)
Essayé aussi de mettre tous les enregistrements de base de données dans la table statut**='OK', donc pas de record a **statut**=_null_ plus, mais je suis **la même exception comme ci-dessus.@JoinColumn
au lieu de@Column
?Comme autre solution, vous pouvez essayer de fournir une exacte définition de la colonne d'avoir une colonne de type VARCHAR:
J'ai exactement le même problème après la mise à niveau de HSQLDB de 1,8 à 2.2.6. Pour les énumérations, Hibernate crée des colonnes de type de CARACTÈRE que l'on fixe la longueur de la colonne (contrairement à VARCHAR). La longueur de celui-ci probablement déterminée comme la longueur de la plus longue valeur d'enum. INSÉRER/mettre à JOUR les déclarations sont correctement généré par Hibernate, mais lors de la lecture des valeurs de la table des courts valeurs de sortir ajouté avec des espaces blancs.
Donc, il semble que HSQLDB conducteur n'a pas à les ajuster. Et si il le devrait, je pense que le bug devrait être déposé pour HSQLDB, pas de mise en veille prolongée. Toutefois, si ce comportement de HSQLDB est compatible avec le standard SQL, puis c'est la Hibernate EnumType devrait faire le parage lors de la lecture des valeurs enum.
VARCHAR(3)
il devrait fonctionner parfaitement dans votre cas (comme le champ longueur est VARiable, et le Statut des valeurs enum ne sont plus que 3 Caractères), maisCHARACTER(3)
vous donne les valeurs ajoutées avec des espaces blancs pour des valeurs plus courtes que 3 personnages, c'est à dire"OK "
. Donc le bug déposé dans Hibernate JIRA semble être inapproprié. (Cependant, je pense toujours que la mise en veille prolongée doit être assez intelligents pour faire face avec des colonnes de longueur fixe dans de tels cas. Partirez pour la veille prolongée devs en compte.)