我正在使用
删除对象session.createQuery("delete Sample sample where sampleId = :sampleId")
.setInteger(sampleId,1).executeUpdate();
这使我删除的行数为1
,这是正确的。
但是当我使用对象的id从会话中获取此对象时,它会给我一个非null值。
因此,使用session.delete()
删除对象与上述查询类似。
答案 0 :(得分:1)
Session.delete(...)
仅在您已经拥有要删除的实体的引用时才有用。
delete-by-query
可用于根据特定条件删除多个对象,这些对象可能是您之前未加载到会话中的对象。
我认为按查询删除实际上会将每个实体加载到会话中并单独删除它们。
这意味着如果执行查询,那么hibernate会将该对象加载到会话中,然后将其从数据库中删除,以便executeUpdate();
之后如果你不刷新session
并尝试get
对象它将返回非null值。其中session.delete()
将删除它并刷新会话(如果FlushMode
处于自动状态)。在这两种情况下,DB都会在事务提交后得到反映。
但是如果你通过保持show-sql
为真来观察控制台,那么在delete()
你会发现如果该对象存在于数据库中,它将首先执行select
然后delete
该对象在DB中不存在,然后在select
上被执行。