posts - 73,  comments - 55,  trackbacks - 0

          Spring+Hibernate中,? 集合映射如果使用lazy="true", 當(dāng)PO傳到View層時, 出現(xiàn)未初始化session已關(guān)閉的錯誤,只能在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可以,但對于復(fù)雜業(yè)務(wù)邏輯就要想點法子。

          OSIV默認(rèn)是request per session的, 所以即使沒有顯式update(po),Hibernate也會幫你保存的,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 保爾任 閱讀(979) 評論(1)  編輯  收藏

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

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


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

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

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 堆龙德庆县| 罗定市| 鞍山市| 翼城县| 泽库县| 泽州县| 淮北市| 金阳县| 德钦县| 陆河县| 洮南市| 丰宁| 于田县| 龙川县| 邳州市| 通渭县| 大理市| 洞头县| 织金县| 汤原县| 揭东县| 襄汾县| 修武县| 徐闻县| 三原县| 内乡县| 保山市| 宝坻区| 永修县| 南阳市| 九江县| 恩施市| 来安县| 莲花县| 林甸县| 天津市| 大港区| 江安县| 泰州市| 邢台县| 耒阳市|