posts - 73,  comments - 55,  trackbacks - 0

          Spring+Hibernate中,? 集合映射如果使用lazy="true", 當(dāng)PO傳到View層時(shí), 出現(xiàn)未初始化session已關(guān)閉的錯(cuò)誤,只能在dao先初始化

          parent.getChilds().size();

          Spring提供Open Session In View來解決這個(gè)問題, 有兩種方式
          1. Interceptor
          ??? <!--?===========?OpenSession?In?View?pattern?==============-->
          ????
          <bean?id="openSessionInViewInterceptor"
          ??????????class
          ="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
          ????????
          <property?name="sessionFactory"?ref="sessionFactory"/>
          ????
          </bean>

          ????
          <bean?id="urlMapping"?class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
          ????????
          <property?name="interceptors"?ref="openSessionInViewInterceptor"/>
          ????????
          <property?name="mappings">
          ????????????
          <props>
          ??????????? ......
          ????????????
          </props>
          ????????
          </property>
          ????
          </bean>
          2. Filter
          <web-app>
          ?
          <filter>
          <filter-name>hibernateFilter</filter-name>
          <filter-class>
          org.springframework.orm.hibernate.support.OpenSessionInViewFilter
          </filter-class>
          </filter>
          ?
          <filter-mapping>
          <filter-name>hibernateFilter</filter-name>
          <url-pattern>*.do</url-pattern>
          </filter-mapping>

          </web-app>

          說明: 個(gè)人更喜歡用Interceptor方式, filter是在web.xml中定義
          有了OpenSessionInView,并不是一切就ok了。簡單的crud可以,但對(duì)于復(fù)雜業(yè)務(wù)邏輯就要想點(diǎn)法子。

          OSIV默認(rèn)是request per session的, 所以即使沒有顯式update(po),Hibernate也會(huì)幫你保存的,dao的業(yè)務(wù)判斷就無效,還好有evict()可用。
          update code
          // Controller
          public?ModelAndView?update()?{
          ????p?
          =?dao.getVo(id);
          ????bindObject(request);
          ????dao.update(p);
          }

          // Dao
          public?Object?getVo(id)?{
          ????p?
          =?getHibernateTemplate().get(clazz,?id);
          ????p.getChilds().size();
          ????getHibernateTemplate().evict(p);
          ????
          return?p;
          }

          public?void?update(p)?{
          ????oldP?
          =?getVo(id);
          ????
          //?++--(oldP);
          ????getHibernateTemplate().update(p);
          ????
          //?++--(p);
          }
          posted on 2006-08-15 17:19 保爾任 閱讀(985) 評(píng)論(1)  編輯  收藏

          FeedBack:
          # re: spring的OpenSessionInView用法
          2007-01-10 13:22 | 前前
          そうか  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 昆明市| 孝感市| 江北区| 工布江达县| 昌宁县| 交城县| 遵义县| 德清县| 平江县| 布拖县| 金阳县| 玛纳斯县| 河西区| 黄浦区| 阿荣旗| 商城县| 平安县| 台北市| 南开区| 延安市| 沐川县| 淮北市| 武川县| 南江县| 金山区| 西吉县| 紫阳县| 福鼎市| 台中市| 蒙城县| 银川市| 建宁县| 丹寨县| 庆安县| 大港区| 原平市| 厦门市| 蓝山县| 噶尔县| 蛟河市| 安平县|