Hallo,
ich habe eine Frage zum Löschen mehrerer Objekte mit HQL.
Zum Problem: Ich habe schematisch die folgende Struktur vorliegen:
- Klasse A hat eine bidirektionale 1:N Beziehung zur Klasse B
- Klasse B hat eine bidirektionale 1:N Beziehung zur Klasse C
- Klasse C hat sonst keine weiteren Beziehungen
Sieht also als angedeutetes Klassendiagramm wie folgt aus: A <-1---*-> B <-1---*-> C
Man könnte sich das ganze auch als Baumstruktur vorstellen, wobei ein A-Objekt die Wurzel des Baumes darstellt, eine Menge von B-Objekten die Baumknoten auf Ebene 1 und eine Menge von C-Objekten die Baumknoten der Ebene 2.
Meine Frage ist nun: Wie gehe ich am Besten vor, wenn ich ein A-Objekt und dann auch direkt alle daran hängenden B-Objekte und auch die daran hängenden C-Objekte löschen will?
Ich habe es mal so versucht, dass ich die jeweiligen Beziehungen mit @Cascade(CascadeType.DELETE) annotiert und dann das gewünschte A-Objekt gelöscht habe. Das brachte auch das gewünschte Resultat, war aber bei vielen Objekten ziemlich lahm.
Dann hab ich es mit HQL-Queries versucht. Dabei habe ich zu erst alle betreffenden C-Objekte gelöscht, danach die betreffenden B-Objekte und zum Schluss das gewünschte A-Objekt. Die von mir verwendeten Queries sehen wiefolgt aus:
Code:
delete from C c where c.b.id in (select b.id from B b where b.a = :a)
delete from B b where b.a = :a
Das gewünschte A hab ich dann mit session.delete() gelöscht. Das geht deutlich flotter als mit @Cascade(CascadeType.DELETE). Weiß jemand, ob das noch besser geht? Zum Beispiel ohne ein Unter-Select? Bin dankbar für jede Anregung, da ich solche Sachen noch in keiner Hibernate-Literatur gefunden habe.