waterye

          OpenSessionInView模式

          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了。簡(jiǎn)單的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 2005-08-23 21:58 waterye 閱讀(5440) 評(píng)論(7)  編輯  收藏 所屬分類: spring

          Feedback

          # re: OpenSessionInView模式 2005-08-25 12:35 江南白衣@ITO

          load,get對(duì)evict()的影響呢?  回復(fù)  更多評(píng)論   

          # re: OpenSessionInView模式 2005-08-25 13:00 Water Ye@ITO

          load大概是從cache中查詢數(shù)據(jù), get是從db查詢數(shù)據(jù), 所以evict()要和get()結(jié)合來使用  回復(fù)  更多評(píng)論   

          # re: OpenSessionInView模式 2005-08-25 21:30 江南白衣@ITO

          網(wǎng)上講這種Open session in view 與 evict()結(jié)合的文章好象沒有阿,難道大家沒遇到同樣的問題,如果做ERP應(yīng)改很經(jīng)常遇到。  回復(fù)  更多評(píng)論   

          # re: OpenSessionInView模式 2005-08-25 21:38 Water Ye@ITO

          估計(jì)大家都沒有開OSIV吧  回復(fù)  更多評(píng)論   

          # re: OpenSessionInView模式 2005-08-29 17:16 Water Ye@ITO

          或許可以用Detached queries來代替evict()  回復(fù)  更多評(píng)論   

          # re: OpenSessionInView模式 2006-06-08 14:57 Ghost

          我項(xiàng)目中采用了OpenSessionInView!  回復(fù)  更多評(píng)論   

          # re: OpenSessionInView模式[未登錄] 2007-07-10 15:27 Chris

          p.getChilds().size();
          是做什么用的。  回復(fù)  更多評(píng)論   

          主站蜘蛛池模板: 红桥区| 惠州市| 吉木萨尔县| 菏泽市| 南漳县| 黑龙江省| 安塞县| 富川| 高邮市| 昌宁县| 南川市| 镇巴县| 伊吾县| 南充市| 嵩明县| 双峰县| 英山县| 小金县| 台州市| 平乡县| 五华县| 瑞安市| 永登县| 淮阳县| 敖汉旗| 桂阳县| 乌海市| 桂林市| 贺兰县| 交城县| 溆浦县| 西吉县| 宁武县| 进贤县| 水富县| 琼中| 三江| 胶州市| 东台市| 朝阳市| 阳谷县|