byterat

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            54 隨筆 :: 0 文章 :: 15 評論 :: 0 Trackbacks

          原文出自: http://www.aygfsteel.com/waterye/archive/2005/08/23/10836.aspx

          OpenSessionInView模式

          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 2007-01-19 15:33 比特鼠 閱讀(310) 評論(0)  編輯  收藏 所屬分類: Java Frameworks
          主站蜘蛛池模板: 五常市| 盐津县| 滁州市| 鄯善县| 桂平市| 罗平县| 玉田县| 苏州市| 望城县| 博野县| 五常市| 曲沃县| 奉化市| 威海市| 光山县| 韶山市| 错那县| 青川县| 莒南县| 宜兴市| 玉门市| 山阳县| 商城县| 铜山县| 黑水县| 罗源县| 汉中市| 大新县| 正蓝旗| 砚山县| 昭平县| 靖宇县| 宝兴县| 会同县| 兴化市| 嘉善县| 汝南县| 出国| 宿州市| 兖州市| 湘潭县|