Ich weiß, dass das Löschen verwaister untergeordneter Objekte eine häufige Frage zu SO und ein häufiges Problem für Hibernate-Neulinge ist und dass die relativ standardmäßige Antwort darin besteht, dass Sie eine Variation von cascade=all,delete-orphan
oder cascade=all-delete-orphan
für die untergeordnete Sammlung haben.Kann Hibernate verwaiste Sammlungen löschen, wenn ein losgelöstes Objekt aktualisiert wird?
Ich möchte in der Lage sein, Hibernate erkennen zu lassen, dass untergeordnete Objekt wurde geleert/aus dem übergeordneten Objekt entfernt und die Zeilen in der unterordneten Tabelle aus der Datenbank gelöscht, wenn das übergeordnete Objekt aktualisiert wird. Zum Beispiel:
Parent parent = session.get(...);
parent.getChildren().clear();
session.update(parent);
Meine aktuelle Zuordnung für die Parent
Klasse wie folgt aussieht:
<bag name="children" cascade="all-delete-orphan">
<key column="parent_id" foreign-key="fk_parent_id"/>
<one-to-many class="Child"/>
</bag>
Dies funktioniert gut für mich, wenn eine angeschlossene Objekt zu aktualisieren, aber ich habe einen Anwendungsfall, in dem wir möchten in der Lage sein, ein losgelöstes Objekt (das von einem Remote-Client über HTTP/JSON an unsere API-Methode gesendet wurde) direkt an die Hibernate-Sitzung zu übergeben, damit Clients das übergeordnete Objekt auf beliebige Weise bearbeiten können sie mögen und haben die Änderungen beibehalten.
Beim Aufruf von session.update(parent)
auf mein losgelöstes Objekt sind die Zeilen in der untergeordneten Tabelle verwaist (die FK-Spalte ist auf Null gesetzt), aber nicht gelöscht. Beachten Sie, dass das erste Mal, wenn die Hibernate-Sitzung diese Objektinstanz sieht, wenn ich session.update()
aufruft, ich das Objekt nicht erneut mit der Sitzung verknüpfe oder auf andere Weise zusammenführe. Ich verlasse mich darauf, dass der Client Objekte übergibt, deren Bezeichner tatsächlichen Objekten in der Datenbank entsprechen. Zum Beispiel ist die Logik in meinem API-Service-Methode etwas wie folgt aus:
String jsonString = request.getParameter(...);
Parent parent = deserialize(jsonString);
session.update(parent);
Ist es möglich, Hibernate, um verwaiste Kinder Sammlungen in frei stehende Elternobjekten zu erkennen, wenn zu session.update(parent)
weitergegeben? Oder missbrauche ich das losgelöste Objekt irgendwie?
Meine Hoffnung war, dass ich jede Art von komplexen Interaktionen mit Hibernate vermeiden konnte, um Änderungen an einer gelösten Instanz zu erhalten. Meine API-Methode muss das gelöste Objekt nach dem Aufruf an session.update(parent)
nicht weiter modifizieren. Diese Methode ist lediglich für die dauerhaften Änderungen verantwortlich, die von Remote-Client-Anwendungen vorgenommen werden.
Haben Sie bedeuten, laden Sie die bestehende Einheit und dann 'merge () 'es mit der abgetrennten Instanz an mich weitergegeben API? –
@ Mattb: Sie können eine Logik zum Zusammenführen der Sammlung schreiben, oder auch nur die vorherige Sammlung ersetzen und die neue setzen, aber stellen Sie sicher, dass Sie Tag in Ihrem hbm hinzugefügt haben. Diese enthält eine einfache SQL-Abfrage zum Löschen der gesamten Sammlung vor dem Speichern einer neuen. oder auf andere Weise, wenn Sie etwas hinzufügen, wird diese sql löschen jedes Mal gefeuert und dann wird eine neue Kopie Ihrer Sammlung hinzugefügt. Dies kann Ihr Problem jedes Mal beheben, wenn Sie die Sammlung manuell aktualisieren. –
Ich bin mir nicht sicher, ob mir diese Lösung gefällt, da ich mein Nutzungsmuster ändern müsste - zum Beispiel ''. Hatte gehofft, dass das mit Mapping behoben werden konnte. –