Hibernate session.flush() 使用

session flush在commit以前默認都會執行, 也能夠手動執行,他主要作了兩件事: 
1) 清理緩存。 
2) 執行SQL。 spring

flush: Session 按照緩存中對象屬性變化來同步更新數據庫。sql

默認狀況下,Session 會在如下狀況下調用 flush:數據庫

1. 直接調用 session.flush。緩存

2. 當應用調用Transaction.commit() 時, 會先調用 flush, 而後再向數據路提交。session

3. 在作查詢時(HQL, Criteria),若是緩存中持久化對象的屬性發生變化,會先 flush 緩存,以保證查詢結果是最新的數據。spa

flush 緩存的例外狀況:若是對象使用native 生成器生成 ID 時,在當調用session.save() 去保存對象時, 會直接向數據庫插入該實體的 insert 語句。hibernate

flush 的五種 FlushModel :對象

一、NEVEL:已經廢棄了,被MANUAL取代了
2 MANUAL:
若是FlushMode是MANUAL或NEVEL,在操做過程當中Hibernate會將事務設置爲readonly,因此在增長、刪除或修改操做過程當中會出現以下錯誤
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition;
解決辦法:配置事務, Spring會讀取事務中的各類配置來覆蓋hibernate的session中的FlushMode;
3 AUTO
設置成auto以後,當程序進行查詢、提交事務或者調用session.flush()的時候,都會使緩存和數據庫進行同步,也就是刷新數據庫
4 COMMIT
提交事務或者session.flush()時,刷新數據庫;查詢不刷新
5 ALWAYS:
每次進行查詢、提交事務、session.flush()的時候都會刷數據庫
事務


ALWAYS和AUTO的區別:當hibernate緩存中的對象被改動以後,會被標記爲髒數據(即與數據庫不一樣步了)。當 session設置爲FlushMode.AUTO時,hibernate在進行查詢的時候會判斷緩存中的數據是否爲髒數據,是則刷數據庫,不是則不刷,而always是直接刷新,不進行任何判斷。很顯然auto比always要高效得多。
rem

 

若是session 中的某個類的屬性發生了改變,使用flush() 方式,去更改數據庫中的記錄,使其和改變後的session 中的對象一致

session.commit 和 session.flush 區別:

session.flush: 執行 一列 sql,可是不提交

session.commit: 會先執行 flush,而後提交事務,提交事務意味着對數據庫的操做永久保存,不可rollback。

相關文章
相關標籤/搜索