| 

.NET C# Java Javascript Exception

not-null property references a null or transient value

Dies ist das Archiv des ehemaligen Forums zum Thema Groovy, Grails, Griffon und Bean Scripting Framework, welches unter groovy-forum.de existierte. Die neue Adresse des Groovy-Forums ist: http://codekicker.de/fragen/themen/groovy.


not-null property references a null or transient value

milkyman - 25.08.2010 11:13
Hallo.

Die DataIntegrityViolationException an sich ist ja nichts neues. Die kommt mit obiger Meldung immer, wenn man ein Objekt speichern will und die Constraints nicht erfüllt sind. Im aktuellen Fall habe ich die Domain um eine notnull Property erweitert, die aber bei den bestehenden Objekten noch nicht gesetzt ist.

Dass ich ein solches Objekt nicht einfach speichern kann, verstehe ich. Dann fliegt die Exception und im Idealfall wird die edit-View angezeigt mit rotem Rahmen um das fehlende Pflichtfeld. Soweit ok.

Aber jetzt ist mir aufgefallen, dass die gleiche Exception auch beim Löschen eines Objektes geworfen wird. Was soll denn das bitte??? Ich kann das Objekt erst löschen, wenn ich das Pflichtfeld gefüllt habe? Na den Benutzer möchte ich sehen, der dafür Verständnis hat. :-)

Hat jemand auch schon mal vor dem Problem gestanden? Gibt es dazu eine sinnvolle Lösung?

Bye,
Horst


Re: not-null property references a null or transient value

saurier - 25.08.2010 12:22
Hallo Horst,

Zitat

Im aktuellen Fall habe ich die Domain um eine notnull Property erweitert, die aber bei den bestehenden Objekten noch nicht gesetzt ist.

Gibt es für so eine Operation, also hinzufügen einer Spalte mit not NULL, überhaupt ein definiertes Verhalten bei Datenbanken?
Ich habe es noch nie ausprobiert, aber Postgresql erlaubt so etwas (laut Doku) gar nicht.

Gruß,
Christian


Re: not-null property references a null or transient value

milkyman - 25.08.2010 13:02
Naja, die Datenbank hat nur indirekt damit was zu tun.

Die String-Property hat keine besonderen Constraints (also weder empty noch null) und ist somit wohl per default not-null.

In der mysql (jaahaa) Datenbank ist das Feld aber schon als nullable angekommen. Somit unkritisch für bestehende Datensätze.

D.h. hier gehen wieder mal ein paar Informationen zwischen den Schichten verloren, was aber derzeit nicht tragisch ist.

Es ist also somit die Grails Validation ganz alleine, die das löschen verhindert.

Any ideas?

Bye,
Horst


Re: not-null property references a null or transient value

milkyman - 26.08.2010 10:10
Hmmm, es kommt wohl drauf an, von welcher Seite man die Sache betrachtet. Grundsätzlich hast du natürlich Recht. Ich könnte ein UPDATE Statement auf die DB schicken und die Sache wäre abgehakt. So wird es auch vermutlich enden, wenn hier keinem was besseres einfällt.

Nur widerstrebt es mir, dieses Verhalten von Grails als gewollt zu akzeptieren.
1. Ich hab das Feld nicht als Pflichtfeld angelegt und muss es auch bei neuen Objekten nicht füllen. (Ich habs nicht mal in der View drin.) Das klappt alles problemlos. Nur bei den alten Objekten hakt es. Aus Sicht den Prototypings ist das sehr suboptimal und logisch sowieso nicht.
2. Warum bitte sollte eine Validierung auf ein Objekt stattfinden, dass ich löschen möchte? Eine Prüfung auf Assoziationen, nach dem Motto ich darf nichts löschen, was noch woanders benötigt wird, ist ja ok. Aber die Properties des Objektes selber? Das halte ich für fragwürdig.

Meine Hoffnung ist ja immer noch, dass heute jemand reinschaut und sagt, das kannst du so und so lösen. :-)

Bye,
Horst


Re: not-null property references a null or transient value

saurier - 26.08.2010 11:30
Hallo Horst,

Zitat

Nur widerstrebt es mir, dieses Verhalten von Grails als gewollt zu akzeptieren.

Ja, es wirkt irgendwie unlogisch. Man müsste wohl in den Quellcode schauen, um zu sehen was
da abläuft. Oder mal in der Mailingliste fragen.

Zitat

1. Ich hab das Feld nicht als Pflichtfeld angelegt und muss es auch bei neuen Objekten nicht füllen. (Ich habs nicht mal in der View drin.) Das klappt alles problemlos.

Da verstehe ich nicht so richtig was du machst. Wenn ich ein property nicht als nullable:true kennzeichne, und
es dann nicht fülle, bekomme ich einen Fehler. Wieso klappt das bei dir? Und wenn es kein Pflichtfeld ist, warum
setzt du dann nicht nullable:true?

Gruß,
Christian


Re: not-null property references a null or transient value

mpuhlmann - 26.08.2010 12:37
Hallo Horst,

Zitat
Horst
Meine Hoffnung ist ja immer noch, dass heute jemand reinschaut und sagt, das kannst du so und so lösen. :-)

Leider muss ich dir diese Hoffnung wohl nehmen. Das ganze ist weniger ein Problem von Grails denn mehr von Hibernate. Wobei es hier auch kein wirkliches Problem ist.

Wenn man das Domain-Modell um Properties erweitert, welche gewissen Constraints unterliegen (in Grails bei neuem String ohne explizite Angabe von Contraints automatisch Not Null), muss man zwangsläufig auch das dahinterliegende relationelle Modell erweitern. Überläßt man diese Aufgabe Hibernate (Grails), wird zwar die Spalte hinzugefügt, bereits existierende Daten werden jedoch nicht mit Default Werten belegt. Wie auch, woher soll Hibernate wissen, was für die Spalte der Default-Wert ist?

Warum Hibernate allerdings auf NotNull-Contraints im Rahmen des Deletes prüft, ist mir auch schleierhaft.

Für mich besteht die einzige Lösung im Setzen von Default-Werten für die Altdaten in der DB. Grundsätzlich würde ich auch die automatische Aktualisierung des DB Schemas durch Hibernate abstellen. Eher sollte man dann das Schema komplett neu anlegen (im Bereich Entwicklung) oder SQL Update Skripte erstellen und in der DB ausführen (im Bereich Test und Produktion).

Gruss

Marco


Re: not-null property references a null or transient value

milkyman - 27.08.2010 07:42
Und wieder eine Illusion weniger. ;-(

Werde ich also in den sauren Apfel beißen, das Verhalten hinnehmen wie es ist und die DB anpassen.

Ich bin übrigens sozusagen im Entwicklungsmodus, habe aber einen gewissen Datenbestand in der DB (ja, könnte man auch per Bootstrap o.ä. anlegen) und will daher kein db-create bei jeder Änderung haben.

Wenn du sagst, dass Hibernate selbst diese not-null Prüfung vornimmt, dann macht es nichtmal Sinn, einen JIRA bei Grails einzustellen, denn da können die es auch nicht ändern.

Bye,
Horst


Re: not-null property references a null or transient value

milkyman - 27.08.2010 07:47
saurier schrieb:
-------------------------------------------------------
> Da verstehe ich nicht so richtig was du machst.
> Wenn ich ein property nicht als nullable:true
> kennzeichne, und
> es dann nicht fülle, bekomme ich einen Fehler.
> Wieso klappt das bei dir? Und wenn es kein
> Pflichtfeld ist, warum
> setzt du dann nicht nullable:true?

Wieso es bei mir klappt, weiß ich nicht. Vielleicht, weil es gar nicht erst in der View drin ist.

Im Endeffekt wird die Property bei neuen Datensätzen mit Leerstring gefüllt. Damit sind sie ungeich null und die Constraints sind zufrieden.

Die alten Datensätze haben aber ein null für die Property und das mag Grails/Hibernate dann halt nicht.

Nullable:true könnte ich in der Tat setzen - oder eben in der DB alles auf Leerstring statt null setzen. Beides sehe ich aber mehr als Workaround, nur weil ich einen alten Datensatz wegen des null Feldes nicht löschen kann. Aber es scheint ja nicht anders möglich zu sein, also DB anpassen und Ruhe ist.

Bye,
Horst


Re: not-null property references a null or transient value

koeberle - 30.08.2010 09:38
Ja es ist Ärgerlich das sich Grails so verhält. Aber mach doch einfach ein Update in der Datenbank.
UPDATE  table_xy SET abc = 'text' WHERE abc = null.

Christian


Re: not-null property references a null or transient value

milkyman - 31.08.2010 08:00
Jepp, irgendwann hab ich mich zum UPDATE durchringen können. Nicht schön, aber hilft ja nichts.

Zudem ist mir gestern aufgefallen, dass Grails/GORM auch seine DB-Spuren nicht komplett verwischt, wenn man die Domains bearbeitet. Ich habe etwas mit 1:1 Beziehungen experimentiert, mal die ID auf der einen Seite, dann auf der anderen. Leider wird die nicht mehr benötigte ID nicht wieder entfernt, so dass man dann doppelte Fremdschlüssel hin und her hat und nichts geht mehr. Da muss man dann auch die DB manuell aufräumen - oder eben doch jedesmal neu erstellen lassen und die Testdaten via Bootstrap.

Bye,
Horst


Re: not-null property references a null or transient value

marndt - 01.09.2010 10:39
Hallo Horst,

das wäre aber auch sehr gefährlich. Ich kann mir vorstellen, dass es Fälle gibt, in denen ich mit GRAILS und meinem Domänenmodell auf existierende Tabellen gehe, oder per Trigger Spaltenwerte berechne usw. Wenn GRAILS die jedesmal weghauen würde, wenn ich sie nicht mehr in meinem Domänenmodell habe, das wäre echt übel.
So ist es dann auch mit den Fremdschlüsseln. Woher soll GRAILS denn beim zweiten Start wissen, dass du beim ersten Start den Schlüssel woanders hattest?

Viele Grüße,

Michael.


Re: not-null property references a null or transient value

marndt - 01.09.2010 12:47
Zitat
milkyman
Ich bin aber jetzt ja im zweiten Fall unterwegs, wo die DB im Rahmen des Prototypings erst neu entsteht. Und da sollte Grails schon zusehen können, dass die Tabellen 1:1 den Domain-Anforderungen entsprechen und keine verwaisten Spalten mehr vorhandne sind.

Du sagst es selber: NEU ENTSTEHT. Dafür gibt es create-drop. Woher soll GRAILS denn wissen, ob du dich im Prototyping oder in der Watungsphase befindest?

Ich habe in der Entwicklung create-drop und in der Bootstrap lade ich die Testdaten. Klappt super, und ich habe die volle Kontrolle. Des Weiteren ist das Durchlaufen des Bootstrap-Daten-in-die-DB-Pumpen-Codes ein guter Test, sollte die Testadeckung mittels Unittests nicht allzu prächtig sein.

Viele Güße

Michael


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "not-null property references a null or transient value" der ehemaligen Webseite groovy-forum.de, welche durch einen Serverunfall zerstört wurde. codekicker.de hat viele Konversationen über die beliebte Programmiersprache Groovy und zugehörige Frameworks wie das Grails-Framework retten können.

Hast Du eine Frage zum Thema Groovy, Grails oder allgemein Java? Viele ehemalige groovy-forum.de Mitglieder beantworten dir auf codekicker.de deine Frage! Stelle jetzt eine Frage!

Viele weitere Diskussionen zu Grails und Groovy befinden sich auf der Threadübersicht des alten groovy-forum.de.