![](/img/trans.png)
[英]Save, delete and update within a single transaction in Spring Data JPA
[英]JPA not taking update into account within single Transaction
在事务服务方法中,我循环查询数据库以获取具有条件的实体A的前10个。
我从列表中更新了每个A实体,以使它们不再符合条件,并调用flush()以确保进行了更改。
在循环中第二次调用查询将返回完全相同的A实体集。
为什么不考虑对实体进行的冲洗更改?
我在Hibernate 4.1.7中使用JPA 2.0。 与Hibernate相同的过程似乎仅在起作用。 我已经关闭了二级缓存和查询缓存,但无济于事。
我使用的是JpaTransactionManager,它是Hibernate上的JPA上的Spring。 用@Transactional注释的主要方法。
该代码将是这样的:
do {
modelList = exportContributionDao.getContributionListToExport(10);
for (M m : modelList) {
//export m to a file
m. (false);
super.flush();
}
} while (modelList.size() == 10);
在循环的每次迭代中,Dao方法始终返回相同的10个结果,而JPA并未考虑更新的“ isToBeExported”属性。
我不是要解决问题,而是要了解为什么JPA的行为不符合此处的预期。 我希望这是一个“经典”问题。 毫无疑问,如果在每次迭代中都提交事务,将可以解决。
ASAIK,缓存L1(即,将Hibernate作为基础JPA提供程序的会话)应该是最新的,并且第二次迭代查询应考虑更新的Entities,即使尚未持久保留更改。 所以我的问题是:为什么不这样呢? 配置错误或知道行为?
刷新不一定会在数据库上提交更改。 您想实现什么? 据我了解,你做某事。 喜欢:
如果这是正确的,为什么您要重新阅读所做的更改而又不使用元素? 离开事务后,更改将自动保持不变。
这肯定应该起作用。
这是我们的配置问题。
对于这个问题,我们深表歉意,很难找出原因,但我希望答案至少对某些人有用:
JPA绝对会考虑在单个事务中对实体所做的更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.