`

spring的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);
}
分享到:
评论

相关推荐

    Spring提供的CharacterEncoding和OpenSessionInView功能

    在基于Hibernate或其他ORM框架的Spring应用中,由于HTTP请求的无状态性,一次数据库操作可能跨多个方法调用,这就需要数据库会话(Session)在整个请求处理过程中保持打开状态。`OpenSessionInViewFilter`就是为了...

    最全的Spring考题与答案

    - POJO编程:Spring鼓励使用Plain Old Java Objects (POJOs),使得应用程序更易于管理和测试。 - 依赖注入(DI)和控制反转(IoC):这两个概念简化了对象之间的依赖关系,使得代码更加解耦,降低了维护成本。 - ...

    OpenSessionInView项目整合jar包

    在Java Web开发中,OpenSessionInView(OSIV)模式是一种常见的解决数据持久化问题的设计模式,主要用于Spring框架与Hibernate等ORM工具的集成。这个模式的主要目的是解决在HTTP请求处理过程中,由于Session范围内的...

    SSH整合 struts+hibernate+spring

    - **代理模式**:使用代理模式来替代Struts默认的Action实例创建机制,通过Spring上下文获取Action实例,而非直接使用new关键字。 - **Struts与Spring整合的注意事项**: - 避免直接在Action类中访问Spring上...

    Spring的学习笔记

    5. **接口使用**:鼓励使用接口编程,因为Spring通过接口进行依赖注入,提供更好的可替换性和可测试性。 **IOC(DI)配置及应用** - **IOC/DI**:控制反转(IOC)是指对象的创建和管理由Spring容器负责,依赖注入...

    spring管理struts和hibernate

    - 利用Spring提供的`OpenSessionInView`模式处理事务边界问题,确保每个HTTP请求都运行在一个独立的事务内。 - 在`web.xml`中配置`OpenSessionInViewFilter`过滤器,自动管理事务。 #### 三、总结 通过以上步骤...

    spring面试题大全

    4. 解决OpenSessionInView问题,可以使用OpenSessionInViewFilter或OpenSessionInViewInterceptor,确保在一次HTTP请求中保持Hibernate Session的开放状态,以解决懒加载异常。 Spring的事务管理分为编程式和声明式...

    spring面试题集

    当遇到OpenSessionInView问题时,可以使用OpenSessionInViewFilter或OpenSessionInViewInterceptor来解决。 Spring的事务管理提供了强大且灵活的机制,主要包括编程式和声明式两种方式: 1. 编程式事务管理:通过...

    Struts+Spring+Hibernate开发实例.pdf

    标题和描述中指出的文档《Struts+Spring+Hibernate开发实例.pdf》包含了关于这三个流行的Java开源框架结合使用的示例代码和相关知识点。Struts负责视图与控制器部分,Spring负责业务逻辑层及依赖注入,Hibernate负责...

    struts2+hirbate+spring面试题

    确保Action线程安全的方法包括:声明局部变量、扩展RequestProcessor以每次创建新的Action实例,或者在Spring中使用`scope="prototype"`配置来管理Action。 2. **Struts2的MVC实现** 在Struts2中: - **Model**:...

    java-spring面试题大全

    Spring 框架是Java开发中的核心组件,尤其在企业级应用中广泛使用。它提供了一个全面的应用程序框架,简化了开发过程并提高了代码的可测试性和可维护性。以下是一些关于Spring的重要知识点,包括其优点、依赖注入(DI...

    Spring配置总结

    本文将重点介绍Spring的配置方法,特别是对于新手来说非常实用的内容。 #### 二、Spring配置详解 ##### 1. **web.xml中的Spring配置** - **载入Log4j配置**: 在web.xml中,我们可以通过`&lt;context-param&gt;`标签...

    面试知识点总结--spring面试题大全.pdf

    为解决OpenSessionInView的问题,可以使用OpenSessionInViewFilter或OpenSessionInViewInterceptor,确保在HTTP请求的整个生命周期内保持Hibernate Session的打开状态,以避免数据持久化问题。 Spring的事务管理: ...

    spring面试题

    - **分层架构**:Spring 采用模块化的分层设计,允许开发者根据需求选择使用相应的模块,提高了灵活性。 - **POJO 编程**:Spring 支持 Plain Old Java Object (POJO),使得对象更易于管理和测试。 - **依赖注入...

Global site tag (gtag.js) - Google Analytics