首先要知道的是:
Hibernate會盡量將與數據庫的操作延遲,直到必須要與數據庫進行交互,例如save方法一般會在提交時才真正執行,最終在提交時會以批處理的方式與數據庫進行交互,以提高效率。
而將操作延遲,就是利用緩存,將最后要處理的操作放到緩存中。
flush方法的主要作用就是清理緩存,強制數據庫與Hibernate緩存同步,以保證數據的一致性。它的主要動作就是向數據庫發送一系列的sql語句,并執行這些sql語句,但是不會向數據庫提交。而commit方法則會首先調用flush方法,然后提交事務。
在下面的情況下,Hibernate會調用Session.flush()以清理緩存:
1)事務提交時,如果flush模式不為FlushMode.NEVER,commit()將調用flush().
2)在某些查詢語句之前(此查詢語句之前的語句已經改變了數據庫狀態,所以需要調用flush()以同步數據庫是查出來的數據是經過更改的)。
除非明確地指定了flush()命令,否則關于Session何時會執行這些JDBC調用完全是無法保證的,只能保證他們執行的前后順序。
通過設置session.setFlushMode(),可以精確控制Hibernate的FlushMode.
(1) FlushMode.AUTO:Hibernate判斷對象屬性有沒有改變,如果被更改成為臟數據,則在一個查詢語句前將更新此改動以保證數據庫的同步。這也是Hibernate的默認清理模式。
(2) FlushMode.COMMIT:在事務結束之前清理session的緩存。這樣有可能導致查出臟數據
(3) FlushMode.NEVER:除非強制調用Session.flush(),否則永遠不清理Session。相當于將數據庫設置為一個只讀的數據庫。
【如果此時進行數據的寫入操作,會發生錯誤】
(4) FlushMode.ALWAYS:在每一個查詢數據之前都調用Session.flush()。很顯然這種效率很低。
在調用Session.flush()時,涉及的SQL語句會按照下面的順序執行。
(1) 所有的實體進行插入的語句,其順序按照對象執行Session.save()的時間順序。
(2) 所有對實體進行更新的語句
(3) 所有對集合元素進行刪除,更新或者插入的語句
(4) 所有對實體經行刪除的語句,其順序按照對象執行Session.delete()的時間順序。
(5) 有一個例外是,如果對象使用native方式生成的ID(持久化標識),則他們一執行save就會被插入。
【因為native方式若想得到主鍵,必須與數據庫交互,而hilo方式則不用】)
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/MageShuai/archive/2009/09/11/4544202.aspx