繁体   English   中英

JPA /休眠:命名查询后忽略持久化

[英]JPA/hibernate: ignored persist after named query

以下的Java代码:

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

foo.field是一个布尔属性。

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

如果foo.field最初为FALSE,则休眠将执行2个SQL查询,即。 setField / persist组合的命名查询和更新查询。 但是,如果foo.field最初为TRUE,则仅执行第一个SQL查询,该查询将所有行中的字段设置为FALSE,第二个SQL查询将被忽略! ...为什么?

让我从“ 使用批量更新和删除 ”一章中引用ProJPA 2的作者。

...持久性上下文未更新以反映操作结果。 批量操作以SQL的形式针对数据库发出,绕过了持久化上下文的内存结构。(...)开发人员只能依赖批量操作完成后检索到的实体。(...)这意味着批量操作操作应该完全在事务中执行,或者应该是事务中的第一个操作

在您的情况下,建议您重新安排代码以将批量更新包含在其自己的事务中,或者在尝试对其进行更改之前在foo上调用EntityManager.refresh()

您所描述的是预期的行为,因为在批量更新后,您的foo实例将变得过时。 它存在于内存中,但不能反映现实。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM