2010-01-20 61 views
5

我想從表中刪除某些記錄。這些記錄在其他表中有一些子記錄。休眠; HQL;爲什麼刪除查詢不起作用,但選擇呢?

爲了能夠刪除主記錄,我必須先刪除子記錄。

下面是所用的HQL的例子:

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

基本上,這應該刪除所有ItineraryBookings(在單獨的表中的記錄),這些被接合到預訂表。預訂表可以與用戶表連接。

奇怪的是,當你改變了上面:

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

並執行Query.list(),它會工作得很好。

每當我想執行刪除變體,它看起來像Hibernate生成一個奇怪的刪除語句。我的HQL錯了嗎?或者它是休眠怪癖?

回答

7

hibernate manual

沒有加入,無論是隱性或顯性的, 可以在大批量HQL語句中指定。 子查詢可用於 其中子句,其中子查詢 本身可能包含連接。

您的ib.booking.user.id子句看起來像一個加入我。我不知道Hibernate是否會在刪除語句中主動拒絕連接,或者只是默默地誤解它。

更好的刪除子記錄的方法是使用cascading deletes

+0

是的,你是對的,他們是joines。我將研究級聯刪除功能,因爲我相信*應該*像那樣工作,但它根本不會。有一個原因是爲什麼其他相關記錄必須明確刪除。 感謝您的回答! – 2010-01-21 07:26:56

0

,可以幫助簡單的問題:

  1. 只是出於好奇,你運行這個HQL的交易?選擇不需要交易,但刪除確實需要它。

  2. 您是否在執行刪除HQL後刷新會話?

  3. 是否正在刪除,並在同一個事務中或單獨的事務中進行選擇?

+0

1.刪除處於交易 2.是 3.單獨交易 – 2010-01-21 07:27:23

+0

可能是您有一些緩存問題?我的意思是數據從數據庫中刪除但仍然存在於內存中?嘗試在執行查詢之前刷新會話,可能會有所幫助。 – 2010-01-21 19:38:54