Pourquoi ai-je une “valeur Null a été attribuée à une propriété de type primitif poseur de” message d'erreur lors de l'utilisation de HibernateCriteriaBuilder dans Graal
J'obtiens l'erreur suivante lors de l'utilisation d'une primitive d'attribut dans mon graal de domaine objet:
Null value was assigned to a property of primitive type setter of MyDomain.myAttribute
org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of MyDomain.myAttribute
at grails.orm.HibernateCriteriaBuilder.invokeMethod(HibernateCriteriaBuilder.java:1077)
- ne salissez pas vos données d'entrée et vous n'aurez pas à utiliser non primitif des wrappers. J'ai manqué de saisir certaines valeurs et j'ai réussi à résoudre cette erreur en l'ajoutant à la base de données.
Vous devez vous connecter pour publier un commentaire.
Selon cette Fil, la solution est d'utiliser la non-primitif types; par exemple,
Integer
au lieu deint
.Une valeur null ne peut pas être attribué à un type primitif, comme int, long, boolean, etc. Si la base de données de la colonne qui correspond au champ dans votre objet peut être null, votre terrain doit être une classe wrapper, comme Integer, Long, Boolean, etc.
Le risque est que votre code fonctionne très bien si il n'y a pas de valeurs null dans la base de données, mais échouera une fois les valeurs null sont insérés.
Et vous pouvez toujours retourner le type primitif de la lecture. Ex:
Mais dans la plupart des cas, vous aurez envie de revenir la classe wrapper.
Donc, soit l'ensemble de votre base de données de la colonne de ne pas autoriser les valeurs null, ou utilisez une classe wrapper.
Un type primitif ne peut pas être null. Donc la solution est de remplacer type primitif avec des primitives de la classe wrapper dans votre tableName.java fichier.
Tels que:
référence http://en.wikipedia.org/wiki/Primitive_wrapper_class trouver la classe wrapper d'un primivite type.
Je vais essayer de vous faire comprendre avec l'aide d'un exemple. Supposons que vous ayez une table relationnelle (ÉTUDIANT), avec deux colonnes et ID(int) et le NOM(Chaîne de caractères). Maintenant que l'ORM vous ai fait une classe d'entité un peu comme comme suit:-
Permet supposons que la table avait déjà entrées. Maintenant, si quelqu'un vous demande d'ajouter une autre colonne de "l'ÂGE" (int)
Vous aurez à définir des valeurs par défaut à NULL pour ajouter une colonne dans une pré-remplis le tableau. Cela permet d'ajouter un autre champ dans la classe. Maintenant, la question se pose de savoir si vous serez en utilisant un type de données primitif ou non primitif de type de données pour déclarer le terrain.
ou
vous devrez déclarer le terrain comme non primitif type de données, car le conteneur va essayer de carte de la table avec de l'entité. Par conséquent, il ne serait pas en mesure de mapper les valeurs NULL (valeur par défaut) si vous ne déclarez pas de champ comme wrapper & finirait par jeter "Null valeur a été attribuée à une propriété de type primitif setter" l'Exception".
utilisez Entier comme le type et fournir setter/getter en conséquence..
@Dinh Nhat, votre méthode de définition des regards mauvais parce que vous mettez un type primitif, il y a de nouveau et il devrait être:
Soit pleinement éviter
null
dans la base de données viaNOT NULL
et en veille prolongée de l'entité via@Column(nullable = false)
en conséquence ou de l'utilisationLong
wrapper au lieu de vouslong
primitives.Un primitif n'est pas un Objet, donc u ne peut pas affecter
null
à elle.Modifier le paramètre type de primitive de l'Objet et de mettre un null vérifier dans l'incubateur. Voir l'exemple ci-dessous
Assurez-vous que votre base de données myAttribute champ contient une valeur null au lieu de zéro.
Il y a deux façon
null
private int var;
peut être initialisé enprivate Integer var;
Ne pas utiliser les primitives dans votre les classes d'Entité, utiliser à la place de leurs respectifs des wrappers. Qui va résoudre ce problème.
De vos classes d'entités, vous pouvez utiliser l' != null validation pour le reste de votre flux de code.