2016-02-27 10 views
1

我正在使用JPA進行數據持久化。JPA中SQL查詢觸發的時間問題

我無法解釋我的程序中的行爲。

我有有另一個實體B爲member.In我的代碼實體A我創建的A新的實例,並在A設置B實例(從數據庫中獲取),然後我用EntityManager保存A。我正在使用容器管理的事務,因此所有事務都應該在方法結束時提交。

在非常相同的方法中,在堅持A之後,我嘗試獲取類C的實體。 C,與A一樣,具有B作爲其成員。我使用JQPL查詢來獲取CB的實例I的ID與之前與A的實例相關聯。

問題是,在提取C時,JPA也在執行SQL查詢以保存A。我期望在事務結束時(即方法結束時)發生。 但它發生在我試圖取C。如果我不提取C,則在方法結束時發出用於保存A的SQL查詢。

這種行爲的原因是什麼?

回答

0

如果查詢結果與當前持久上下文狀態不一致,JPA提供程序需要在查詢執行前刷新持久化上下文。

您可以將flush mode設置爲COMMIT以獲取所需(或全部)會話。請記住,如果查詢取決於髒持久性上下文狀態,請手動刷新會話。默認刷新模式爲AUTO,這意味着可以在執行查詢之前刷新持久性上下文。

+0

嗯....這是一個非常合理的點。萬分感謝。順便說一句,你怎麼知道JPA行爲的每一個細節。我每次都在繼續閱讀和試驗,但是現在這些問題還在不斷出現,我覺得很難解釋。任何好的資源? – Mandroid

+0

不客氣。沒有一個涵蓋一切的學習資源。書籍,論壇,文章,實驗,深潛源代碼... –

+0

你應該閱讀規範https://jcp.org/en/jsr/detail?id=338 恕我直言,這是非常清楚。 順便說一句,我的答案是正確的以防萬一...... –