Montag, 9. Februar 2009

Update von Hibernate gemappten Beans mit eingebetten Listen weiterer Hibernate Beans und CascadeType DeleteOrphan

Ich bin heute auf ein interessantes Problem gestoßen, als ich einer Mutti eins ihrer Kinder wegnehmen wollte. Ich habe 2 Hibernate gemappte Beans, Mutti und Kind. Die Mutti hat eine Liste von Kindern. Die Kinder eine Referenz auf die Mutti. Die Mutti und die Kinder werden in einem Webservice in eine Datenbank persistiert und in einer separaten Webanwendung bearbeitet. Also sind die Muttis und Kinder nur im Webservice mit einer Hibernate Session assoziiert. Wenn jetzt in der Webanwendung einer Mutti ein Kind genommen wird, kommt eine reine, saubere Mutti ohne Hibernate Proxies in den Webservice. Wenn jetzt der Webservice ein session.update(mutti)[Die Mutti "mutti" ist die mit einem Kind weniger] ausführt, verhält sich Hibernate sehr human und mitfühlend und nimmt der Mutti "mutti", trotz gesetzter Annotation
@Cascade(value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
, nicht das Kind weg. In meinen Unit Tests hat das allerdings super funktioniert. Nach vergeblicher Suche nach einer unmenschlichen Hibernate Implementation hab ich das Problem genauer analysiert und festgestellt, dass mein Problem nichts mit dem sozialen Bewusstsein von Hibernate zu tun hat, sondern daran liegt, dass die Mutti "mutti" auf der Reise vom und wieder zurück zum Webservice "nur" eine ArrayList und keine Hibernate PersistantBag-Implementation bekommen hat. Diese war in meinen Unit Tests allerdings vorhanden. Daraus folgt, dass ein DELETE_ORPHAN nur zusammen mit einem PersistantBag funktioniert, den man nur bekommt, wenn das Objekt, in unserem Fall die Mutti "mutti", von einer Hibernate Session erzeugt wurde. Nach Studium der Doku zu session.merge kam ich zu folgender Lösung des Problems:

Mutti backendMutti = (Mutti) session.merge(frontendMutti);
session.update(backendMutti);
Jetzt kann mein Hibernate Muttis auch die Kinder wegnehmen :-)

1 Kommentar:

Anonym hat gesagt…

test

  © Blogger template 'Morning Drink' by Ourblogtemplates.com 2008

Back to TOP