繁体   English   中英

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,即使尚未持久保留更改。 所以我的问题是:为什么不这样呢? 配置错误或知道行为?

刷新不一定会在数据库上提交更改。 您想实现什么? 据我了解,你做某事。 喜欢:

  1. 关于实体的循环
  2. 在循环中,更改实体
  3. 在实体上调用“冲洗”
  4. 再次读回实体
  5. 您想知道为什么数据库中的数据没有更改?

如果这是正确的,为什么您要重新阅读所做的更改而又不使用元素? 离开事务后,更改将自动保持不变。

这肯定应该起作用。

这是我们的配置问题。

对于这个问题,我们深表歉意,很难找出原因,但我希望答案至少对某些人有用:

JPA绝对会考虑在单个事务中对实体所做的更改。

暂无
暂无

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

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