2010-01-20 4 views
5

Ich möchte bestimmte Datensätze aus einer Tabelle löschen. Diese Datensätze enthalten einige untergeordnete Datensätze in anderen Tabellen.Ruhezustand; HQL; Warum funktioniert die Löschabfrage nicht, aber wählen Sie?

Um die Hauptsätze löschen zu können, muss ich zuerst die untergeordneten Datensätze löschen. Hier

ist das Beispiel der HQL verwendet:

delete from ItineraryBooking ib where ib.booking.user.id = :paramId 

Grundsätzlich sollte dies alle ItineraryBookings entfernen (Datensätze in separaten Tabelle), werden diese auf der Buchungstabelle verknüpft. Eine Buchungstabelle kann mit der Benutzertabelle verknüpft werden.

Das Seltsame ist, dass, wenn Sie die oben ändern:

from ItineraryBooking ib where ib.booking.user.id = :paramId 

und führen eine Query.list(), wird es gut funktionieren.

Wann immer ich die Lösch-Variante ausführen möchte, sieht es aus wie Hibernate erzeugt eine ungerade Löschanweisung. Ist mein HQL falsch? Oder ist es eine Hibernate-Eigenart?

Antwort

7

Vom hibernate manual:

Nein verbindet, entweder implizit oder explizit, kann in einer Bulk-HQL-Abfrage angegeben werden. Unterabfragen können in der Where-Klausel verwendet werden, wobei die Unterabfragen selbst Joins enthalten können.

Ihre ib.booking.user.id Klausel sieht aus wie eine Verbindung zu mir. Ich weiß nicht, ob Hibernate Joins in einer delete-Anweisung aktiv ablehnt oder es einfach stillschweigend falsch interpretiert.

Eine bessere Möglichkeit, untergeordnete Datensätze zu löschen, ist die Verwendung cascading deletes.

+0

Ja, Sie haben Recht, sie sind Joines. Ich werde in die kaskadierenden Löschfunktionen schauen, weil ich glaube, dass es * so funktionieren sollte, aber das tut es einfach nicht. Es gab einen Grund, warum die anderen verwandten Datensätze explizit gelöscht werden mussten. Danke für die Antwort! –

0

Einfache Fragen, die helfen können:

  1. Gerade für Neugier, führen Sie diese HQL in einer Transaktion? selects benötigt keine Transaktion, löscht sie aber.

  2. Spülen Sie die Sitzung nach dem Ausführen der Lösch-HQL?

  3. Löschen und Auswählen in der gleichen Transaktion oder in separaten?

+0

1. Das Löschen ist in einer Transaktion 2. Ja 3. Separate Transaktionen –

+0

Können Sie einige Caching-Probleme haben? Ich meine die Daten werden aus der Datenbank gelöscht, sind aber immer noch im Speicher vorhanden? Versuchen Sie, die Sitzungen zu leeren, bevor Sie die Abfragen ausführen, möglicherweise würde das helfen. –