在事務性服務方法中,我循環查詢數據庫以獲取具有條件的實體A的前10個。JPA沒有在單個事務中考慮更新
我更新列表中的每個實體,以使它們不再與條件匹配,並調用flush()以確保進行更改。
對循環中的查詢的第二次調用返回完全相同的一組實體。
爲什麼不考慮實體上的刷新更改?
我在Hibernate 4.1.7中使用JPA 2.0。 與Hibernate相同的進程似乎只是工作。 我已經關閉二級緩存和查詢緩存,無濟於事。
我在JPA上使用了一個相當簡單的配置,JpaTransactionManager,Spring 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);
隨着循環的每次迭代中,道方法總是返回相同的10個結果,JPA沒有考慮到更新的「isToBeExported」屬性。
我不是想解決一個問題,而是想了解爲什麼JPA在這裏沒有按照預期行事。我期望這是一個'經典'問題。 毫無疑問,如果交易將在每次迭代中被提交,它將被解決。
ASAIK,緩存L1(即Hibernate作爲底層JPA提供者的會話)應該是最新的,第二次迭代查詢應考慮更新的實體,即使尚未保留更改。 所以我的問題是:爲什麼不是這樣?配置錯誤或知道行爲?
這裏需要更多的信息。您的SSCCE包含代碼循環,實體管理器的實例化,實體類的註釋部分在哪裏?此外,還包括是否使用CMT,以及是否在查詢中明確定義了鎖定模式。額外的要點包括數據庫模式的相關部分。 – Perception
你在同一個交易中查找A實體嗎?作爲一種關係的一部分? – sorencito
對不起,未提供SSCCE,我已更新原始帖子。一切都在一次交易中發生。 A不是關係的一部分,至少在查詢中沒有被使用。 – nodje