2012-05-29 83 views
10

我想知道是否有人可以告訴我什麼是休眠髒會話?我似乎遇到了一個問題,即當標準查詢不應該執行插入操作時。我相信這是與一個骯髒的會議有關,但不知道真正的骯髒的會議是什麼,我無法解決我的問題。另外,你如何創建一個骯髒的會議。謝謝。什麼是Hibernate髒會話?

回答

19

Hibernate的會話是緩存中保存的更改。它緩存從數據庫中讀取的實體,它還緩存對包含的實體所做的更改以及添加和刪除的實體,直到會話刷新(即將所有掛起的更改寫入數據庫)。

一個會話被稱爲當一些變化還沒有被刷新。因此有一個骯髒的會議是完全正常的。會話在事務提交之前刷新。

+0

如果我不希望查詢觸發刷新,我應該設置標準查詢setFlushMode爲手動,還是你concided此樂隊援助固定? –

+0

@George如果您不想保存對對象所做的更改,請嘗試在會話外執行這些更改 – richarbernal

+0

我想我必須查找有關如何在會話之外存儲數據的其他信息。我對hibernate仍然很陌生,所以不能完全確定它是如何進入會話的。 –

2

它只是意味着你已經對尚未刷新到數據庫的內存中,管理的持久對象進行了更改。

基本上,休眠背後的想法是,在內存中的持久對象的狀態是應用程序的狀態。如果您對託管對象進行更改,則hibernate將在下一次機會中將其放入數據庫中。你不應該對你不打算持久化的託管對象進行'臨時'更改,因爲它們將會!

在執行查詢之前,hibernate將所有託管對象的內存狀態刷新到數據庫,以便查詢相對於應用程序的狀態是準確的。

+0

實際上,它比這更復雜:只有當掛起的更改可能會影響執行的查詢時,纔會刷新Hibernate。 –

+0

是否有推薦的方法來阻止查詢在我告訴它插入對象之前執行插入操作?我用setFetchMode手動工作,但我覺得這可能只是一個樂隊援助修復,而不是根修復。 –

+1

如果您不希望在事務結束前執行插入和更新操作,則可以在SessionFactory中將整個應用程序的FlushMode更改爲COMMIT,而不是MANUAL。不過,如果您要對不想寫入數據庫的託管實體進行更改,而不僅僅是一個bandaid,那麼這是修復程序。 – Affe

5

Hibernate中的一個髒會話是當你在會話中加載一個對象然後修改它的時候。

或者,當您打開會話並創建一個新對象時。

即使你沒有可明確調用任何插入/更新操作時,Hibernate標誌着會話當會話關閉

2

簡而言之:我們知道髒數據是尚未提交的數據。以同樣的方式,hibernate中的dirty會話包含尚未提交的已修改數據。