在事务服务方法中,我循环查询数据库以获取具有条件的实体 A 的前 10 个。
我更新列表中的每个 A 实体,使它们不再符合条件,并调用 flush() 以确保进行了更改。
循环内对查询的第二次调用返回完全相同的 A 实体集。
为什么不考虑实体上的刷新更改?
我将 JPA 2.0 与 Hibernate 4.1.7 一起使用。与 Hibernate 相同的过程似乎只在工作。我已经关闭了二级缓存和查询缓存,无济于事。
我正在使用一个相当简单的配置,JpaTransactionManager,Spring over JPA over Hibernate。使用@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 提供者的 Session,应该是最新的,并且第二次迭代查询应该考虑更新的 Entities,即使更改尚未持久化。所以我的问题是:为什么不是这样?配置错误或知道行为?