ORM-Objekte in einem Request speichern und neu einlesen
Ein sehr interessantes Phänomen im Zusammenhang mit ColdFusion-ORM hat sich gezeigt, als in einem CFM-Request ein Objekt mit EntityNew neu erstellt und im späteren Verlauf im selben Request mit EntityLoad wieder ausgelesen wurde. Ein Teil der Daten (nämlich die, die mit einer Join-Tabelle verknüpft waren) wurde bei der Ausgabe einfach nicht korrekt dargestellt.
Ein Objekt wird mit EntityNew und EntitySave neu erstellt:
2<cfset oObject.setid(CreateUUID()) />
3<cfset oObject.settitel("irgendein Test") />
4<cfset EntitySave(oObject, true ) />
Dieses Objekt kann man im selben Request auch mit EntityLoad wieder laden, das funktioniert und zeigt die richtigen Daten an:
Ebenso kann man im selben Request nochmals ein Update machen:
2<cfset EntitySave(getObject, false ) />
Wie Ben Nadel unter http://www.bennadel.com/blog/1673-Learning-ColdFusion-9-When-Does-An-ORM-Enabled-Object-Get-Persisted.htm beschreibt, ist nicht einmal das abschliessende EntitySave notwendig, die Daten werden beim Update auch ohne diese Programmzeile in die Datenbank geschrieben.
Ganz anders verhält es sich aber, wenn man ein Objekt erstellen bzw. aktualisieren möchte, welches per Join mit einer anderen Tabelle verknüpft ist. Zum Beispiel eine neue Aufgabe, die ich einem bestimmten Mitarbeiter zuordnen möchte:
2<cfset oObject.setid(CreateUUID()) />
3<cfset oObject.settitel("irgendein Test") />
4<cfset oObject.setmitarbeiter_id("4711") />
5<cfset EntitySave(oObject, true ) />
Möchte ich den neu erstellten Eintrag im selben Request wieder einlesen, so behauptet ColdFusion, die Aufgabe wäre keinem Mitarbeiter zugeordnet:
Ebenso verhält es sich, wenn beim Update ein anderer Mitarbeiter eingetragen wird:
Die Aktualisierung wird einfach nicht angezeigt. Erst bei einer Ausgabe in einem neuen ColdFusion-Dokument ist der richtige Eintrag vorhanden.
Dieses Problem lässt sich beheben, wenn nach dem Speichern der Entity auch ein Flush und ein Reload durchgeführt wird:
2<cfset ormflush() />
3<cfset EntityReload(getObject) />