Warum wird bei Verwendung von HibernateCriteriaBuilder in Grails die Fehlermeldung "Nullwert wurde einer Eigenschaft des primitiven Typensetzers von zugewiesen" angezeigt


100

Bei Verwendung eines primitiven Attributs in meinem Grails-Domänenobjekt wird der folgende Fehler angezeigt:

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)

Verwirren Sie Ihre Dateneingabe nicht und Sie müssen keine nicht-primitiven Wrapper verwenden. Ich habe einige Werte nicht eingegeben und konnte diesen Fehler beheben, indem ich ihn der Datenbank hinzufügte.
Goot

Antworten:


167

Gemäß diesem SO-Thread besteht die Lösung darin, die nicht-primitiven Wrapper-Typen zu verwenden. zB Integerstatt int.


6
Alle Codehaus-Dienste wurden eingestellt.
Priyanshu Chauhan

46

Ein Nullwert kann keinem primitiven Typ wie int, long, boolean usw. zugewiesen werden. Wenn die Datenbankspalte, die dem Feld in Ihrem Objekt entspricht, null sein kann, sollte Ihr Feld eine Wrapper-Klasse wie Integer, Long, sein. Boolescher Wert usw.

Die Gefahr besteht darin, dass Ihr Code einwandfrei ausgeführt wird, wenn die Datenbank keine Nullen enthält, aber nach dem Einfügen von Nullen fehlschlägt.

Und Sie können den primitiven Typ immer vom Getter zurückgeben. Ex:

  private Integer num;

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

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

In den meisten Fällen möchten Sie jedoch die Wrapper-Klasse zurückgeben.

Stellen Sie entweder Ihre DB-Spalte so ein, dass keine Nullen zulässig sind, oder verwenden Sie eine Wrapper-Klasse.


13

Ein primitiver Typ kann nicht null sein. Die Lösung besteht also darin, den primitiven Typ durch die primitive Wrapper-Klasse in Ihrer tableName.java-Datei zu ersetzen. Sowie:

@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;
}

Verweisen Sie auf http://en.wikipedia.org/wiki/Primitive_wrapper_class , um die Wrapper-Klasse eines primitiven Typs zu finden.


8

Ich werde versuchen, Sie anhand eines Beispiels verständlich zu machen. Angenommen, Sie hatten eine relationale Tabelle (STUDENT) mit zwei Spalten und ID (int) und NAME (String). Als ORM hätten Sie eine Entitätsklasse wie folgt erstellt: -

package com.kashyap.default;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * @author vaibhav.kashyap
 *
 */
@Entity
@Table(name = "STUDENT")
public class Student implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -1354919370115428781L;

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "NAME")
    private String name;

    public Student(){

    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

Nehmen wir an, die Tabelle hatte bereits Einträge. Wenn jemand Sie fragt, fügen Sie eine weitere Spalte von "AGE" (int) hinzu.

ALTER TABLE STUDENT ADD AGE int NULL

Sie müssen Standardwerte als NULL festlegen, um eine weitere Spalte in eine vorgefüllte Tabelle einzufügen. Dadurch können Sie der Klasse ein weiteres Feld hinzufügen. Nun stellt sich die Frage, ob Sie einen primitiven Datentyp oder einen nicht primitiven Wrapper-Datentyp zum Deklarieren des Felds verwenden.

@Column(name = "AGE")
private int age;

oder

@Column(name = "AGE")
private INTEGER age;

Sie müssen das Feld als nicht primitiven Wrapper-Datentyp deklarieren, da der Container versucht, die Tabelle der Entität zuzuordnen. Daher kann es keine NULL-Werte zuordnen (Standard), wenn Sie das Feld nicht als Wrapper deklarieren und schließlich die Ausnahme "Nullwert wurde einer Eigenschaft des primitiven Typensetzers zugewiesen" auslösen.


6

Verwenden Sie Integer als Typ und geben Sie Setter / Getter entsprechend an.

private Integer num;

public Integer getNum()...

public void setNum(Integer num)...

4

Verwenden Sie in Ihren Entity-Klassen keine Grundelemente , sondern deren jeweilige Wrapper. Das wird dieses Problem beheben.

Außerhalb Ihrer Entitätsklassen können Sie die Validierung! = Null für den Rest Ihres Codeflusses verwenden.


3

Vermeiden Sie dies entweder vollständig nullin DB via NOT NULLund in Hibernate Entity via @Column(nullable = false)entsprechend oder verwenden Sie LongWrapper anstelle Ihrer longGrundelemente.

Ein Grundelement ist kein Objekt, daher können Sie es nicht zuweisen null.


3

Es gibt zwei Möglichkeiten

  • Stellen Sie sicher, dass die Datenbankspalte nicht zulässig ist null
  • User Wrapper-Klassen für die primitive Typvariable like private int var;können als initialisiert werdenprivate Integer var;

2

@ Dinh Nhat, deine Setter-Methode sieht falsch aus, weil du dort wieder einen primitiven Typ eingefügt hast und es sollte sein:

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

2

Ändern Sie den Parametertyp von primitiv in Objekt und setzen Sie eine Nullprüfung in den Setter. Siehe Beispiel unten

public void setPhoneNumber(Long phoneNumber) {
    if (phoneNumber != null)
        this.phoneNumber = phoneNumber;
    else
        this.extension = 0l;
}

2
@Column(name ="LEAD_ID")
private int leadId; 

Ändern

@Column(name ="LEAD_ID")
private Integer leadId; 

1

Stellen Sie sicher, dass Ihr Datenbankfeld myAttribute null statt null enthält.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.