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);
}
分享到:
相关推荐
在基于Hibernate或其他ORM框架的Spring应用中,由于HTTP请求的无状态性,一次数据库操作可能跨多个方法调用,这就需要数据库会话(Session)在整个请求处理过程中保持打开状态。`OpenSessionInViewFilter`就是为了...
- POJO编程:Spring鼓励使用Plain Old Java Objects (POJOs),使得应用程序更易于管理和测试。 - 依赖注入(DI)和控制反转(IoC):这两个概念简化了对象之间的依赖关系,使得代码更加解耦,降低了维护成本。 - ...
在Java Web开发中,OpenSessionInView(OSIV)模式是一种常见的解决数据持久化问题的设计模式,主要用于Spring框架与Hibernate等ORM工具的集成。这个模式的主要目的是解决在HTTP请求处理过程中,由于Session范围内的...
- **代理模式**:使用代理模式来替代Struts默认的Action实例创建机制,通过Spring上下文获取Action实例,而非直接使用new关键字。 - **Struts与Spring整合的注意事项**: - 避免直接在Action类中访问Spring上...
5. **接口使用**:鼓励使用接口编程,因为Spring通过接口进行依赖注入,提供更好的可替换性和可测试性。 **IOC(DI)配置及应用** - **IOC/DI**:控制反转(IOC)是指对象的创建和管理由Spring容器负责,依赖注入...
- 利用Spring提供的`OpenSessionInView`模式处理事务边界问题,确保每个HTTP请求都运行在一个独立的事务内。 - 在`web.xml`中配置`OpenSessionInViewFilter`过滤器,自动管理事务。 #### 三、总结 通过以上步骤...
4. 解决OpenSessionInView问题,可以使用OpenSessionInViewFilter或OpenSessionInViewInterceptor,确保在一次HTTP请求中保持Hibernate Session的开放状态,以解决懒加载异常。 Spring的事务管理分为编程式和声明式...
当遇到OpenSessionInView问题时,可以使用OpenSessionInViewFilter或OpenSessionInViewInterceptor来解决。 Spring的事务管理提供了强大且灵活的机制,主要包括编程式和声明式两种方式: 1. 编程式事务管理:通过...
标题和描述中指出的文档《Struts+Spring+Hibernate开发实例.pdf》包含了关于这三个流行的Java开源框架结合使用的示例代码和相关知识点。Struts负责视图与控制器部分,Spring负责业务逻辑层及依赖注入,Hibernate负责...
确保Action线程安全的方法包括:声明局部变量、扩展RequestProcessor以每次创建新的Action实例,或者在Spring中使用`scope="prototype"`配置来管理Action。 2. **Struts2的MVC实现** 在Struts2中: - **Model**:...
Spring 框架是Java开发中的核心组件,尤其在企业级应用中广泛使用。它提供了一个全面的应用程序框架,简化了开发过程并提高了代码的可测试性和可维护性。以下是一些关于Spring的重要知识点,包括其优点、依赖注入(DI...
本文将重点介绍Spring的配置方法,特别是对于新手来说非常实用的内容。 #### 二、Spring配置详解 ##### 1. **web.xml中的Spring配置** - **载入Log4j配置**: 在web.xml中,我们可以通过`<context-param>`标签...
为解决OpenSessionInView的问题,可以使用OpenSessionInViewFilter或OpenSessionInViewInterceptor,确保在HTTP请求的整个生命周期内保持Hibernate Session的打开状态,以避免数据持久化问题。 Spring的事务管理: ...
- **分层架构**:Spring 采用模块化的分层设计,允许开发者根据需求选择使用相应的模块,提高了灵活性。 - **POJO 编程**:Spring 支持 Plain Old Java Object (POJO),使得对象更易于管理和测试。 - **依赖注入...