Hibernate學習(七):session.flush與transaction.commit

sessionsave方法爲例來看一個簡單、完整的事務流程,以下是代碼片斷:sql

…………………………………………………………………………數據庫

Session session = sessionFactory.openSession(); 緩存

Transaction tx = session.beginTransaction(); session

session.save(customer);//以前已實例化好了的一個對象 ide

tx.commit(); 測試

…………………………………………………………………………spa

示例很簡單,就是向數據庫中插入一條顧客信息,這是一個最簡單的數據庫事務。在這個簡單的過程當中,Hibernate爲咱們作了一些什麼事情呢?爲了更好的觀察,咱們將Hibernateshow_sql屬性設置爲true,而後運行咱們的程序,控制檯打印出以下信息:orm

Hibernate: select max(ID) from CUSTOMER 對象

Hibernate: insert into CUSTOMER (NAME, EMAIL, PASSWORD, PHONE, ADDRESS, SEX, IS_MARRIED, description, BIRTHDAY, REGISTERED_TIME, ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 事務

這裏也許看不出什麼端倪來,如今在session.save(customer)後面加一行代碼,輸出這個customerOIDSystem.out.println(customer.getId()),再次運行程序,控制檯輸出爲:

Hibernate: select max(ID) from CUSTOMER

22

Hibernate: insert into CUSTOMER (NAME, EMAIL, PASSWORD, PHONE, ADDRESS, SEX, IS_MARRIED, description, BIRTHDAY, REGISTERED_TIME, ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

OIDinsert語句以前輸出,這能夠說明兩個問題:1.insert語句並非在執行save的時候發送給數據庫的;2.insert語句是在執行commit的時候發送給數據庫的。結合前面咱們所說過的:執行save的時候,Hibernate會首先把對象放入緩存,而後計劃一條insert語句。一個基本的插入流程就出來了:

1.  判斷所要保存的實例是否已處於持久化狀態,若是不是,則將其置入緩存;

2.  根據所要保存的實例計劃一條insert sql語句,注意只是計劃,並不執行;

3.  事務提交時執行以前所計劃的insert語句;

後臺還打印出了select max(ID) from CUSTOMER,這主要是爲了給customer賦予一個OID,由於通常狀況下臨時對象的OIDNULL

接着咱們作兩個測試:

1.  tx.commit();註釋掉,此時控制檯沒有打印出insert語句;

2.  tx.commit()換成session.flush,此時控制太打印出了insert語句,可是數據庫中並無添加新的記錄;

經過查閱HibernateAPI能夠知道flush方法的主要做用就是清理緩存,強制數據庫

Hibernate緩存同步,以保證數據的一致性。它的主要動做就是向數據庫發送一系列的sql語句,並執行這些sql語句,可是不會向數據庫提交。而commit方法則會首先調用flush方法,而後提交事務。這就是爲何咱們僅僅調用flush的時候記錄並未插入到數據庫中的緣由,由於只有提交了事務,對數據庫所作的更新纔會被保存下來。由於commit方法隱式的調用了flush,因此通常咱們都不會顯示的調用flush方法。

相關文章
相關標籤/搜索