ORM-Objekte in einem Request speichern und neu einlesen

Christian Hojas, Senior Webapplication-Entwickler

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:

1<cfset oObject = EntityNew("aufgaben") />
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:

1<cfset getObject = EntityLoad("aufgaben", {id="#oObject.getid()#"}, true ) />

Ebenso kann man im selben Request nochmals ein Update machen:

1<cfset getObject.settitel("automatischer Test - update") />
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:

1<cfset oObject = EntityNew("aufgaben") />
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:

1<cfset getObject = EntityLoad("aufgaben", {id="#oObject.getid()#"}, true ) />

Ebenso verhält es sich, wenn beim Update ein anderer Mitarbeiter eingetragen wird:

1<cfset getObject.setmitarbeiter_id("4712") />

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:

1<cfset EntitySave(getObject, true ) />
2<cfset ormflush() />
3<cfset EntityReload(getObject) />