Hibernate session FlushMode有五種屬性

1、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要高效得多。

 

總結:若OpenSessionInViewFilter在getSession的時候,會把獲取回來的session的flush mode 設爲FlushMode.NEVER。然後把該sessionFactory綁定到TransactionSynchronizationManager,使request的整個過程都使用同一個session,在請求過後再解除該sessionFactory的綁定,最後closeSessionIfNecessary根據該session是否已和transaction綁定來決定是否關閉session。在這個過程中,若HibernateTemplate 發現自當前session有不是readOnly的transaction,就會獲取到FlushMode.AUTO Session,使方法擁有寫權限。
也即是,如果有不是readOnly的transaction就可以由Flush.NEVER轉爲Flush.AUTO,擁有insert,update,delete操作權限,如果沒有transaction,並且沒有另外人爲地設flush model的話,則doFilter的整個過程都是Flush.NEVER。所以受transaction保護的方法有寫權限,沒受保護的則沒有。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章