posts - 73,  comments - 55,  trackbacks - 0

          Spring+Hibernate中,? 集合映射如果使用lazy="true", 當PO傳到View層時, 出現未初始化session已關閉的錯誤,只能在dao先初始化

          parent.getChilds().size();

          Spring提供Open Session In View來解決這個問題, 有兩種方式
          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>

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

          OSIV默認是request per session的, 所以即使沒有顯式update(po),Hibernate也會幫你保存的,dao的業務判斷就無效,還好有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 保爾任 閱讀(979) 評論(1)  編輯  收藏

          FeedBack:
          # re: spring的OpenSessionInView用法
          2007-01-10 13:22 | 前前
          そうか  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 明溪县| 石柱| 马山县| 全州县| 马边| 福海县| 河津市| 拜泉县| 阿拉善盟| 通城县| 闽侯县| 包头市| 女性| 琼海市| 连江县| 康保县| 丰台区| 高唐县| 禄劝| 花垣县| 阿克陶县| 深圳市| 林周县| 曲阳县| 江山市| 龙门县| 得荣县| 太白县| 临漳县| 虹口区| 义马市| 涡阳县| 楚雄市| 米泉市| 木里| 天峻县| 安仁县| 梅州市| 广水市| 永康市| 定结县|