1. 程式人生 > >Hibernate Session的Flush模式

Hibernate Session的Flush模式

首先要知道的是:

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方式則不用】)