2014-09-04 64 views
0

Java代码:JPA /休眠:忽略一直存在命名查询

fooDAO.resetField(); // ...namedQuery 
foo.setField(true); 
fooDAO.persist(foo); 

foo.field是一个布尔属性。

resetField()执行一个命名查询,将所有db行中的字段设置为FALSE。

如果foo.field最初是FALSE,hibernate执行2个SQL查询,即。指定的查询和setField/persist组合的更新查询。 但是,如果foo.field最初为TRUE,只是第一个SQL查询得到执行,将所有行中的字段设置为FALSE,第二个SQL查询将被忽略! ...为什么?

+1

需要看更多的代码才能得出结论。你给出的测试用例应该可以正常工作。它应该执行两个查询。 – 2014-09-04 08:00:45

回答

1

让我引用作者ProJPA 2使用批量更新和删除

...持续性 上下文未更新以反映操作结果。批量操作是针对数据库的 SQL发出的,绕过了持久化上下文的内存中结构。(...)开发人员只能依赖大容量操作完成后检索到的实体。(...)这意味着批量操作 要么在交易中交易执行全部由自己或者是第一操作

在你的情况,我建议要么重新安排的代码在自己的事务附上批量更新或致电EntityManager.refresh()foo尝试更改它之前。

您所描述的是预期的行为,因为批量更新后您的foo实例变得陈旧。它存在于记忆中,但不反映现实。