2010-01-20 65 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