Jason ---分享,共同進步

          激情成就夢想,努力創(chuàng)造未來
          隨筆 - 53, 文章 - 1, 評論 - 45, 引用 - 0
          數據加載中……

          hibernate lazy

          今天項目組有要使用的hibernate lazy的,我一直對這種lazy的方式是不贊成使用的,所以我的項目組內是明確不能使lazy,包括true和false當然hibernate 默認的模式是true ,但是在程序中我們是可以控制,當然如果不做配置話,也無法在前端使用,其實在項目中,用到lazy的時候并不是特別多(個人觀點),大部分的數據都是明確的要在后臺查詢出來的。用lazy也并不復雜,在web.xml中配置

          Xml代碼 復制代碼
          1. <filter>  
          2.     <filter-name>hibernateFilter</filter-name>  
          3.     <filter-class>  
          4.         org.springframework.orm.hibernate3.support.OpenSessionInViewFilter   
          5.     </filter-class>  
          6.     <init-param>  
          7.         <param-name>singleSession</param-name>  
          8.         <param-value>false</param-value>  
          9.     </init-param>  
          10. </filter>  
          11.   
          12. <filter-mapping>  
          13.     <filter-name>hibernateFilter</filter-name>  
          14.     <url-pattern>*.do</url-pattern>  
          15. </filter-mapping>  

           

          就可以使用延遲加載了,spring通過filter的方式對綁定hibernate session 到request的線程中。

          that binds a Hibernate Session to the thread for the entire processing of the request

           

          剛開始我是把上面這段配置隨便放到web.xml中,一致不成功總報session 關閉,不起作用,最后查了一下,我把這個filter放到了struts的filter之上,就可以了。

           

           

          說明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過濾器的配置,配置過濾器的時候配置
          <filter>
                
          <filter-name>openSession</filter-name>
                
          <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
                
          <init-param>
                    
          <param-name>flushMode</param-name>
                    
          <param-value>AUTO</param-value>
                
          </init-param>
            
          </filter>

          3 AUTO

          設置成auto之后,當程序進行查詢、提交事務或者調用session.flush()的時候,都會使緩存和數據庫進行同步,也就是刷新數據庫

          4 COMMIT

          提交事務或者session.flush()時,刷新數據庫;查詢不刷新


          5 ALWAYS

          每次進行查詢、提交事務、session.flush()的時候都會刷數據庫
          這里需要說一下和AUTO的區(qū)別,當hibernate緩存中的對象被改動之后,會被標記為臟數據(即與數據庫不同步了)。當session設置為FlushMode.AUTO時,hibernate在進行查詢的時候會判斷緩存中的數據是否為臟數據,是則刷數據庫,不是則不刷,而always是直接刷新,不進行任何判斷。很顯然auto比always要高效得多。

           

          posted on 2011-08-12 13:17 agun 閱讀(920) 評論(0)  編輯  收藏 所屬分類: java web

          主站蜘蛛池模板: 霸州市| 连山| 张掖市| 普兰店市| 孟连| 兴宁市| 肇源县| 台山市| 嘉义市| 永清县| 神池县| 新沂市| 奉化市| 同江市| 赤峰市| 碌曲县| 秦安县| 宁强县| 江津市| 敦煌市| 荆州市| 永嘉县| 房产| 万州区| 邳州市| 延边| 东乡族自治县| 盐池县| 荥阳市| 奎屯市| 南汇区| 共和县| 嘉定区| 石屏县| 民和| 宁德市| 儋州市| 西安市| 永年县| 苏尼特左旗| 富平县|