Hibernate Objekte löschen auf Kaskade
Ich bin leicht verwirrt, wie die cascade="delete" funktioniert. Ich definierte die Zuordnung in der folgenden Art und Weise in der Stadt mapping-Datei:
<set inverse="true" name="client" cascade="delete">
<key>
<column name="id_name"/>
</key>
<one-to-many class="model.Client"/>
</set>
Die Klasse Client über einen Fremdschlüssel für eine Klasse Stadt.
Also bei mir laufen:
List object = null;
try {
org.hibernate.Transaction tx = session.beginTransaction();
try {
session.delete("from City where row_id=" + row_id and table_id = " + table_id);
} catch (Exception e) {
e.printStackTrace();
}
}
Sollten alle clients sowie gelöscht werden oder muss ich damit umgehen irgendwie? Bin ich die übergabe der Abfrage als parameter der Methode korrekt auf die delete () - Methode einer session? Vielen Dank für jede Hilfe.
Beste Grüße,
sass.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Cascading eine
delete
Betrieb bedeutet, dass, wenn Siedelete
einer Muttergesellschaft, den Betrieb weitergegeben wird, entlang der Vereinigung. Also in deinem Fall, löschenCity
Person weitergegeben werden sollen, um dieClient
s.Den
Session#delete(String)
- Methode mit einem HQL-query-string, führt Sie aus, iteriert über die Ergebnisse und fordertSession#delete(Object)
auf jedes Objekt hinsichtlich Kaskadierung (also die Clients werden gelöscht, wenn Ihre Abfrage ist wirklich eine HQL query).Aber diese Methode ist alt und veraltet in Hibernate 3 (und in den "klassischen"
Session
interface), kann ich nicht wirklich empfehlen (es führt 1+N Vorgänge und ist ziemlich ineffizient zu löschen eine große Anzahl von Ergebnissen).Wenn dies ist ein Anliegen, lieber die bulk löschen Unterstützung von Hibernate:
Aber beachten Sie, dass bulk-delete Einschränkungen:
Also mit einer bulk-löschen, müssten Sie die zum löschen der
Client
vor derCity
. Aber die Leistungen sind viel besser.PS: Sie müssen
commit()
an einem gewissen Punkt (und auch verbessern Sie Ihre Fehlerbehandlung d.h.rollback()
im catch-block)Referenzen
Wenn Sie löschen einer Stadt, dann werden alle Kunden gelöscht werden. Wenn Sie einen Mandanten löschen, wird die Stadt allein gelassen.
session.delete()
nicht aufgerufen werden kann, mit einer HQL-Abfrage. Du musst es eine Stadt zu löschen.Alternativ können Sie
session.createSQLQuery()
erstellen Sie eine delete-Anweisung. Das ermöglicht das löschen von vielen Städten in einem Rutsch. Der Nachteil bei dieser Methode ist, dass Sie löschen müssen die Kunden selbst und den cache leeren (Hibernate macht keinen Versuch zu verstehen, was Ihre Abfrage könnte bedeuten).Session#delete(String)
wurde als veraltet markiert in den Ruhezustand und zog den klassischen API. Hibernate bietet nun eine Unterstützung für DML-Stil-Operationen (a la Java Persistence API (JPA).