2012-12-10 40 views
0

在事務性服務方法中,我循環查詢數據庫以獲取具有條件的實體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提供者的會話)應該是最新的,第二次迭代查詢應考慮更新的實體,即使尚未保留更改。 所以我的問題是:爲什麼不是這樣?配置錯誤或知道行爲?

+0

這裏需要更多的信息。您的SSCCE包含代碼循環,實體管理器的實例化,實體類的註釋部分在哪裏?此外,還包括是否使用CMT,以及是否在查詢中明確定義了鎖定模式。額外的要點包括數據庫模式的相關部分。 – Perception

+0

你在同一個交易中查找A實體嗎?作爲一種關係的一部分? – sorencito

+0

對不起,未提供SSCCE,我已更新原始帖子。一切都在一次交易中發生。 A不是關係的一部分,至少在查詢中沒有被使用。 – nodje

回答

1

刷新不一定提交數據庫上的更改。你想實現什麼?從我的理解你做s.th.像:

  1. 環關於實體
  2. 內循環,再次改變實體
  3. 呼籲實體「沖洗」
  4. 閱讀實體
  5. 你想知道爲什麼數據沒有變化在數據庫上?

如果這是正確的,爲什麼你重新閱讀更改,而不是與元素一起工作?離開交易後,所做的更改將自動持續進行。

+0

這是我們團隊提交的開發人員的原始代碼。這不是一個好的設計,它已經被改變和解決了。 爲了理解JPA,我試圖弄清楚這是應該工作還是它是一個預期的行爲。 – nodje

0

這應該肯定有效。

這是我們的配置問題。

道歉的問題,這是非常難以發現我方的原因,但我希望答案至少是有益的一些:

JPA肯定考慮到在一個單一的實體進行的更改交易。