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)
Antworten:
Gemäß diesem SO-Thread besteht die Lösung darin, die nicht-primitiven Wrapper-Typen zu verwenden. zB
Integer
stattint
.quelle
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:
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.
quelle
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:
Verweisen Sie auf http://en.wikipedia.org/wiki/Primitive_wrapper_class , um die Wrapper-Klasse eines primitiven Typs zu finden.
quelle
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: -
Nehmen wir an, die Tabelle hatte bereits Einträge. Wenn jemand Sie fragt, fügen Sie eine weitere Spalte von "AGE" (int) hinzu.
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.
oder
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.
quelle
Verwenden Sie Integer als Typ und geben Sie Setter / Getter entsprechend an.
quelle
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.
quelle
Vermeiden Sie dies entweder vollständig
null
in DB viaNOT NULL
und in Hibernate Entity via@Column(nullable = false)
entsprechend oder verwenden SieLong
Wrapper anstelle Ihrerlong
Grundelemente.Ein Grundelement ist kein Objekt, daher können Sie es nicht zuweisen
null
.quelle
Es gibt zwei Möglichkeiten
null
private int var;
können als initialisiert werdenprivate Integer var;
quelle
@ Dinh Nhat, deine Setter-Methode sieht falsch aus, weil du dort wieder einen primitiven Typ eingefügt hast und es sollte sein:
quelle
Ändern Sie den Parametertyp von primitiv in Objekt und setzen Sie eine Nullprüfung in den Setter. Siehe Beispiel unten
quelle
Ändern
quelle
Stellen Sie sicher, dass Ihr Datenbankfeld myAttribute null statt null enthält.
quelle