waterye

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 2005-08-23 21:58 waterye 阅读(5433) 评论(7)  编辑  收藏 所属分类: spring

Feedback

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

load,get对evict()的影响呢?  回复  更多评论   

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

load大概是从cache中查询数据, get是从db查询数据, 所以evict()要和get()结合来使用  回复  更多评论   

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

网上讲这种Open session in view 与 evict()结合的文章好象没有阿,难道大家没遇到同样的问题,如果做ERP应改很经常遇到。  回复  更多评论   

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

估计大家都没有开OSIV吧  回复  更多评论   

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

或许可以用Detached queries来代替evict()  回复  更多评论   

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

我项目中采用了OpenSessionInView!  回复  更多评论   

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

p.getChilds().size();
是做什么用的。  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: