J'obtiens l'erreur suivante lors de l'utilisation d'un attribut primitif dans mon objet de domaine Grails:
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)
Réponses:
Selon ce thread SO , la solution est d'utiliser les types de wrapper non primitifs; par exemple,
Integer
au lieu deint
.la source
Une valeur nulle ne peut pas être affectée à un type primitif, comme int, long, boolean, etc. Si la colonne de base de données qui correspond au champ de votre objet peut être nulle, alors votre champ doit être une classe wrapper, comme Integer, Long, Booléen, etc.
Le danger est que votre code fonctionnera correctement s'il n'y a pas de valeurs nulles dans la base de données, mais échouera une fois les valeurs nulles insérées.
Et vous pouvez toujours renvoyer le type primitif depuis le getter. Ex:
Mais dans la plupart des cas, vous souhaiterez renvoyer la classe wrapper.
Donc, définissez votre colonne DB pour ne pas autoriser les valeurs nulles ou utilisez une classe wrapper.
la source
Un type primitif ne peut pas être nul. La solution consiste donc à remplacer le type primitif par la classe d'encapsulation primitive dans votre fichier tableName.java. Tel que:
référence http://en.wikipedia.org/wiki/Primitive_wrapper_class pour trouver la classe wrapper d'un type primitif.
la source
Je vais essayer de vous faire comprendre à l'aide d'un exemple. Supposons que vous ayez une table relationnelle (STUDENT) avec deux colonnes et ID (int) et NAME (String). Maintenant, en tant que ORM, vous auriez créé une classe d'entité un peu comme suit: -
Supposons que la table ait déjà des entrées. Maintenant, si quelqu'un vous demande d'ajouter une autre colonne de "AGE" (int)
Vous devrez définir les valeurs par défaut comme NULL pour ajouter une autre colonne dans un tableau pré-rempli. Cela vous oblige à ajouter un autre champ dans la classe. La question se pose maintenant de savoir si vous utiliserez un type de données primitif ou un type de données wrapper non primitif pour déclarer le champ.
ou
vous devrez déclarer le champ comme type de données wrapper non primitif car le conteneur essaiera de mapper la table avec l'entité. Par conséquent, il ne serait pas en mesure de mapper les valeurs NULL (par défaut) si vous ne déclarez pas le champ comme wrapper et lèverait éventuellement une exception "La valeur Null a été affectée à une propriété du setter de type primitif".
la source
utilisez Integer comme type et fournissez setter / getter en conséquence.
la source
N'utilisez pas de primitives dans vos classes Entity , utilisez plutôt leurs wrappers respectifs. Cela résoudra ce problème.
À partir de vos classes Entity, vous pouvez utiliser la validation! = Null pour le reste de votre flux de code.
la source
Soit éviter complètement
null
dans DB viaNOT NULL
et dans l'entité Hibernate via en@Column(nullable = false)
conséquence ou utiliserLong
wrapper à la place de voslong
primitives.Une primitive n'est pas un objet, donc vous ne pouvez pas lui assigner
null
.la source
Il y a deux façons
null
private int var;
peuvent être initialisées commeprivate Integer var;
la source
@Dinh Nhat, votre méthode setter semble incorrecte car vous y mettez à nouveau un type primitif et cela devrait être:
la source
Changez le type de paramètre de primitif à Object et mettez une vérification nulle dans le setter. Voir l'exemple ci-dessous
la source
Changer pour
la source
Assurez-vous que le champ myAttribute de votre base de données contient null au lieu de zéro.
la source