繼續(xù)關(guān)注我的C語言學(xué)習(xí)博客

          林臨的地盤

          java學(xué)習(xí)博客
          posts - 44, comments - 28, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

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

          Hibernate的Lazy初始化1:n關(guān)系時(shí),必須保證是在同一個Session內(nèi)部使用這個關(guān)系集合,不然Hiernate將拋出異常:org.hibernate.LazyInitializationException: failed to lazily initialize of....
          兩種處理方法:
          一、設(shè)置lazy=false,此方法不再累述。
          二、用OpenSessionInViewFilter過濾器,注意hibernateFilter過濾器和struts2過濾器在映射時(shí)的先后順序。同時(shí)要配置事物處理,否則會導(dǎo)致session處于只讀狀態(tài)而不能做修改、刪除的動作。
          即在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等編碼設(shè)定功能與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 允許對關(guān)聯(lián)對象、屬性進(jìn)行延遲加載,但是必須保證延遲加載的操作限于同一個 Hibernate Session 范圍之內(nèi)進(jìn)行。如果 Service 層返回一個啟用了延遲加載功能的領(lǐng)域?qū)ο蠼o Web 層,當(dāng) Web 層訪問到那些需要延遲加載的數(shù)據(jù)時(shí),由于加載領(lǐng)域?qū)ο蟮?Hibernate Session 已經(jīng)關(guān)閉,這些導(dǎo)致延遲加載數(shù)據(jù)的訪問異常。而Spring為我們提供的OpenSessionInViewFilter過濾器為我們很好的解決了這個問題。OpenSessionInViewFilter的主要功能是使每個請求過程綁定一個 Hibernate Session,即使最初的事務(wù)已經(jīng)完成了,也可以在 Web 層進(jìn)行延遲加載的操作。OpenSessionInViewFilter 過濾器將 Hibernate Session 綁定到請求線程中,它將自動被 Spring 的事務(wù)管理器探測到。所以 OpenSessionInViewFilter 適用于 Service 層使用HibernateTransactionManager 或 JtaTransactionManager 進(jìn)行事務(wù)管理的環(huán)境,也可以用于非事務(wù)只讀的數(shù)據(jù)操作中。
          request-->open session-->打開連接、開始事務(wù)-->持久操作-->渲染(關(guān)閉連接、session)-->response 其中一些過程省略了,不是很關(guān)心。

           

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

          繼續(xù)關(guān)注我的C語言學(xué)習(xí)博客
          主站蜘蛛池模板: 苍梧县| 喀什市| 万山特区| 永吉县| 甘德县| 桂林市| 浑源县| 泰州市| 郴州市| 汉中市| 泽州县| 科技| 谷城县| 寻乌县| 绥滨县| 玉门市| 紫阳县| 东方市| 南通市| 积石山| 西昌市| 西吉县| 沂南县| 若羌县| 宁安市| 佛冈县| 南投市| 安化县| 梁平县| 穆棱市| 石台县| 灵宝市| 黄陵县| 隆化县| 屏南县| 曲阜市| 布拖县| 高青县| 蒙城县| 行唐县| 阳原县|