122 votes

Pourquoi est-ce que je reçois un message d'erreur "Une valeur nulle a été affectée à une propriété de type primitif", lors de l'utilisation de HibernateCriteriaBuilder dans Grails

L'erreur suivante s'affiche lorsque j'utilise 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)
 

213voto

Peter Points 1681

Selon http://jira.codehaus.org/browse/GRAILS-646, la solution consiste à utiliser les types de wrapper non primitifs (par exemple, Integer au lieu de int).

58voto

MattC Points 478

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:

  private Integer num;

  public void setNum(Integer i) {
    this.num = i;
  }

  public int getNum() {
    return this.num;
  }

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.

14voto

Dinh Nhat Points 171

Un type primitif ne peut pas être nul. La solution consiste donc à remplacer le type primitif par la classe wrapper primitive dans votre fichier nomTable.java. Tel que:

 @Column(nullable=true, name="client_os_id")
private Integer client_os_id;

public int getClient_os_id() {
    return client_os_id;
}

public void setClient_os_id(int clientOsId) {
    client_os_id = clientOsId;
}
 

référence http://en.wikipedia.org/wiki/Primitive_wrapper_class pour trouver une classe wrapper d'un type primitif.

6voto

user3067802 Points 71

utilisez Integer comme type et fournissez le setter / getter en conséquence.

private Integer num;

public Integer getNum () ...

public void setNum (Integer num) ...

2voto

@Dinh Nhat, votre méthode de définition n'a pas l'air bonne parce que vous y mettez un type primitif qui devrait être:

 public void setClient_os_id(Integer clientOsId) {
client_os_id = clientOsId;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X