繼續關注我的C語言學習博客

          林臨的地盤

          java學習博客
          posts - 44, comments - 28, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          struts2+spring2.x+hibernate3.x 懶加載異常:org.hibernate.LazyInitializationException: failed to lazily initialize

          Hibernate的Lazy初始化1:n關系時,必須保證是在同一個Session內部使用這個關系集合,不然Hiernate將拋出異常:org.hibernate.LazyInitializationException: failed to lazily initialize of....
          兩種處理方法:
          一、設置lazy=false,此方法不再累述。
          二、用OpenSessionInViewFilter過濾器,注意hibernateFilter過濾器和struts2過濾器在映射時的先后順序。同時要配置事物處理,否則會導致session處于只讀狀態而不能做修改、刪除的動作。
          即在web.xml文件中如下配置:
               <!-- Spring ApplicationContext配置文件的加載目錄。 -->  
           <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:spring/applicationContext.xml</param-value>
           </context-param>

           <!-- 解決延遲加載的問題 -->
           <filter>
            <filter-name>hibernateFilter</filter-name>
            <filter-class>
             org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
            </filter-class>
           </filter>
           
           <!-- 繼承Struts2的FilterDispatcher類,具備GBK等編碼設定功能與struts2的action過濾功能。 -->
           <filter>
            <filter-name>struts2</filter-name>
            <filter-class>
             com.iman.nrms.opm.web.common.FilterDispatcher
            </filter-class>
            <init-param>
             <param-name>encoding</param-name>
             <param-value>GBK</param-value>
            </init-param>
           </filter>
           <filter>
                   <filter-name>struts-cleanup</filter-name>
                   <filter-class>
                       org.apache.struts2.dispatcher.ActionContextCleanUp
                   </filter-class>
               </filter>
           
           <filter-mapping>
            <filter-name>hibernateFilter</filter-name>
            <url-pattern>/*</url-pattern>
           </filter-mapping>
           
           <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
           </filter-mapping>
           
           <filter-mapping>
            <filter-name>struts-cleanup</filter-name>
            <url-pattern>/*</url-pattern>
           </filter-mapping>

          Hibernate 允許對關聯對象、屬性進行延遲加載,但是必須保證延遲加載的操作限于同一個 Hibernate Session 范圍之內進行。如果 Service 層返回一個啟用了延遲加載功能的領域對象給 Web 層,當 Web 層訪問到那些需要延遲加載的數據時,由于加載領域對象的 Hibernate Session 已經關閉,這些導致延遲加載數據的訪問異常。而Spring為我們提供的OpenSessionInViewFilter過濾器為我們很好的解決了這個問題。OpenSessionInViewFilter的主要功能是使每個請求過程綁定一個 Hibernate Session,即使最初的事務已經完成了,也可以在 Web 層進行延遲加載的操作。OpenSessionInViewFilter 過濾器將 Hibernate Session 綁定到請求線程中,它將自動被 Spring 的事務管理器探測到。所以 OpenSessionInViewFilter 適用于 Service 層使用HibernateTransactionManager 或 JtaTransactionManager 進行事務管理的環境,也可以用于非事務只讀的數據操作中。
          request-->open session-->打開連接、開始事務-->持久操作-->渲染(關閉連接、session)-->response 其中一些過程省略了,不是很關心。

           

          引自:http://blog.csdn.net/fhwbj/archive/2009/03/25/4022805.aspx

          繼續關注我的C語言學習博客
          主站蜘蛛池模板: 阳高县| 华宁县| 五寨县| 无为县| 钟山县| 鄂伦春自治旗| 东明县| 临桂县| 济源市| 祥云县| 南川市| 遵义县| 城口县| 滕州市| 鲜城| 龙井市| 伊金霍洛旗| 庆元县| 达拉特旗| 耿马| 岑溪市| 桐乡市| 灵台县| 玉环县| 库车县| 安庆市| 木里| 鄄城县| 治多县| 漠河县| 揭阳市| 平乡县| 峡江县| 布拖县| 安新县| 灵寿县| 南开区| 张家口市| 家居| 土默特右旗| 淮滨县|