首先要知道的是:

Hibernate會盡量將與數(shù)據(jù)庫的操作延遲,直到必須要與數(shù)據(jù)庫進(jìn)行交互,例如save方法一般會在提交時才真正執(zhí)行,最終在提交時會以批處理的方式與數(shù)據(jù)庫進(jìn)行交互,以提高效率。

而將操作延遲,就是利用緩存,將最后要處理的操作放到緩存中。

flush方法的主要作用就是清理緩存,強(qiáng)制數(shù)據(jù)庫與Hibernate緩存同步,以保證數(shù)據(jù)的一致性。它的主要動作就是向數(shù)據(jù)庫發(fā)送一系列的sql語句,并執(zhí)行這些sql語句,但是不會向數(shù)據(jù)庫提交。而commit方法則會首先調(diào)用flush方法,然后提交事務(wù)。
     
      在下面的情況下,Hibernate會調(diào)用Session.flush()以清理緩存:
     1)事務(wù)提交時,如果flush模式不為FlushMode.NEVER,commit()將調(diào)用flush().
     2)在某些查詢語句之前(此查詢語句之前的語句已經(jīng)改變了數(shù)據(jù)庫狀態(tài),所以需要調(diào)用flush()以同步數(shù)據(jù)庫是查出來的數(shù)據(jù)是經(jīng)過更改的)。
    
     除非明確地指定了flush()命令,否則關(guān)于Session何時會執(zhí)行這些JDBC調(diào)用完全是無法保證的,只能保證他們執(zhí)行的前后順序。

 
  通過設(shè)置session.setFlushMode(),可以精確控制Hibernate的FlushMode.
  (1)  FlushMode.AUTO:Hibernate判斷對象屬性有沒有改變,如果被更改成為臟數(shù)據(jù),則在一個查詢語句前將更新此改動以保證數(shù)據(jù)庫的同步。這也是Hibernate的默認(rèn)清理模式。
  (2) FlushMode.COMMIT:在事務(wù)結(jié)束之前清理session的緩存。這樣有可能導(dǎo)致查出臟數(shù)據(jù)
  (3) FlushMode.NEVER:除非強(qiáng)制調(diào)用Session.flush(),否則永遠(yuǎn)不清理Session。相當(dāng)于將數(shù)據(jù)庫設(shè)置為一個只讀的數(shù)據(jù)庫。
       【如果此時進(jìn)行數(shù)據(jù)的寫入操作,會發(fā)生錯誤】
  (4) FlushMode.ALWAYS:在每一個查詢數(shù)據(jù)之前都調(diào)用Session.flush()。很顯然這種效率很低。
 
 在調(diào)用Session.flush()時,涉及的SQL語句會按照下面的順序執(zhí)行。
(1)         所有的實(shí)體進(jìn)行插入的語句,其順序按照對象執(zhí)行Session.save()的時間順序。
(2)         所有對實(shí)體進(jìn)行更新的語句
(3)         所有對集合元素進(jìn)行刪除,更新或者插入的語句
(4)         所有對實(shí)體經(jīng)行刪除的語句,其順序按照對象執(zhí)行Session.delete()的時間順序。
(5)         有一個例外是,如果對象使用native方式生成的ID(持久化標(biāo)識),則他們一執(zhí)行save就會被插入。
                 【因?yàn)閚ative方式若想得到主鍵,必須與數(shù)據(jù)庫交互,而hilo方式則不用】)

 

本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/MageShuai/archive/2009/09/11/4544202.aspx