FlushMode屬性

參見hibernate的api說明https://www.hibernate.org/hib_docs/v3/api/org/hibernate/FlushMode.html 說明FlushMode有五種屬性 1 NEVEL 已經廢棄了,被MANUAL取代了 2 MANUAL spring3.x中的opensessioninviewfilter已經將默認的FlushMode設置爲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; 解決辦法網上有很多; 1 配置事務,spring會讀取事務中的各種配置來覆蓋hibernate的session中的FlushMode; 2 先編程式修改FlushMode,比如session.setFlushMode(FlushMode.AUTO); 這樣hibernate就會自動去除readonly限制; 3 直接修改opensessioninviewfilter過濾器的配置,配置過濾器的時候配置 openSessionorg.springframework.orm.hibernate3.support.OpenSessionInViewFilterflushModeAUTO 3 AUTO 設置成auto之後,當程序進行查詢、提交事務或者調用session.flush()的時候,都會使緩存和數據庫進行同步,也就是刷新數據庫4 COMMIT 提交事務或者session.flush()時,刷新數據庫;查詢不刷新 5 ALWAYS 每次進行查詢、提交事務、session.flush()的時候都會刷數據庫 這裏需要說一下和AUTO的區別,當hibernate緩存中的對象被改動之後,會被標記爲髒數據(即與數據庫不同步了)。當session設置爲FlushMode.AUTO時,hibernate在進行查詢的時候會判斷緩存中的數據是否爲髒數據,是則刷數據庫,不是則不刷,而always是直接刷新,不進行任何判斷。很顯然auto比always要高效得多。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章