簡體   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