2014-05-15 68 views
0

我在批量數據庫導出應用程序中使用Hibernate。Hibernate查詢和會話緩存混淆

假設實體名單每HQL加載遍歷並讀取引用的對象/集合值:讀了很多問題/答案和文章有關會話緩存我還是不明白以下後。在這種情況下會在Session Cache中保存被引用的對象/集合嗎?

回答

0

是它。

當你執行一個HQL查詢返回的所有實體必須在本屆會議上加載。這是因爲實體處於ATTACHED狀態,所以任何修改都可以通過「髒檢查機制」檢測到。

如果要插入大量實體,最好在每個批次之後輸入flush() and clear(),以便從當前第一級刪除當前條目,因爲您無論如何都不需要它們在下一批中。

如果您正在檢索一個適合您當前RAM的大型實體集合,並且希望實體在整個時間內都被連接到一個給定實體上,那麼在批處理結束時,您將刷新並驅逐( )當前處理的實體。這次你不清除(),因爲你仍然想保留附加的未處理的實體,這樣Hibernate可以將更改傳播到數據庫。

+0

謝謝你的回答。但是在每篇關於Hibernate緩存的文章中,都有一個關於NOT CACHED查詢結果的討論,除非第二級緩存被激活? – user3639982

+0

這是你的很棒的評論。有三種類型的緩存:第一級(面向會話),第二級(由所有會話共享),查詢緩存(存儲由查詢返回的實體ID,因爲實際實體應該在第二級緩存中)。因此,在事務結束並且會話關閉後,查詢結果不會被緩存,除非激活第二級緩存和查詢緩存。 –

+0

請看下面的文章:http://apmblog.compuware.com/2009/02/16/understanding-caching-in-hibernate-part-one-the-session-cache/,尤其是下面的句子:「Using上面的代碼我們希望查詢只執行一次,但是如果我們看一下這個事務的PurePath,我們可以看到,兩個數據庫查詢已經被執行了。「 – user3639982