对hibernate中的删除查询执行executeUpdate是否也会从会话中删除该对象

时间:2014-07-07 17:30:04

标签: hibernate

我正在使用

删除对象
session.createQuery("delete Sample sample where sampleId = :sampleId")
.setInteger(sampleId,1).executeUpdate();

这使我删除的行数为1,这是正确的。 但是当我使用对象的id从会话中获取此对象时,它会给我一个非null值。

因此,使用session.delete()删除对象与上述查询类似。

1 个答案:

答案 0 :(得分:1)

Session.delete(...)仅在您已经拥有要删除的实体的引用时才有用。

delete-by-query可用于根据特定条件删除多个对象,这些对象可能是您之前未加载到会话中的对象。

我认为按查询删除实际上会将每个实体加载到会话中并单独删除它们。

这意味着如果执行查询,那么hibernate会将该对象加载到会话中,然后将其从数据库中删除,以便executeUpdate();之后如果你不刷新session并尝试get对象它将返回非null值。其中session.delete()将删除它并刷新会话(如果FlushMode处于自动状态)。在这两种情况下,DB都会在事务提交后得到反映。

但是如果你通过保持show-sql为真来观察控制台,那么在delete()你会发现如果该对象存在于数据库中,它将首先执行select然后delete该对象在DB中不存在,然后在select上被执行。

阅读更多@ http://www.codejava.net/frameworks/hibernate/hibernate-basics-3-ways-to-delete-an-entity-from-the-datastore