Spring为我们解决最让人头痛的难题之一,Hibernate的Session的关闭与开启问题。
Hibernate 允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行。如果 Service 层返回一个启用了延迟加载功能的领域对象给 Web 层,当 Web 层访问到那些需要延迟加载的数据时,由于加载领域对象的 Hibernate Session 已经关闭,这些导致延迟加载数据的访问异常。而Spring为我们提供的OpenSessionInViewFilter过滤器为我们很好的解决了这个问题。OpenSessionInViewFilter的主要功能是使每个请求过程绑定一个 Hibernate Session,即使最初的事务已经完成了,也可以在 Web 层进行延迟加载的操作。OpenSessionInViewFilter 过滤器将 Hibernate Session 绑定到请求线程中,它将自动被 Spring 的事务管理器探测到。所以 OpenSessionInViewFilter 适用于 Service 层使用HibernateTransactionManager 或 JtaTransactionManager 进行事务管理的环境,也可以用于非事务只读的数据操作中。
<!--OpenSessionInViewFilter配置,其实是一个又繁琐性能又低的东西,以后再也不想用到-->
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<!-- singleSession默认为true,若设为false则等于没用OpenSessionInView -->
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--Spring Context listener-->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!--让spring知道事务管理的bean所在-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
<!--struts 2.0 过滤器配置-->
<filter>
<filter-name>struts</filter-name>
<filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
有可能会提示找不 sessionFactory 解决办法:
OpenSessionInViewFilter的方要作用就是可以在 Web 层进行延迟加载的操作
OpenSessionInViewFilter构造器原码
Java代码
public OpenSessionInViewFilter()
{
sessionFactoryBeanName = "sessionFactory";
singleSession = true;
}
public OpenSessionInViewFilter()
{
sessionFactoryBeanName = "sessionFactory";
singleSession = true;
}
可以通过修改web.xml中过滤器配置,如下
Java代码
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory_wap</param-value>
</init-param>
</filter>
分享到:
相关推荐
5. 最终,当视图渲染完成后,OpenSessionInViewFilter会关闭Session,释放相关资源,结束这次请求处理。 使用OpenSessionInViewFilter时需要注意以下几点: 1. **事务管理**:OpenSessionInViewFilter并不负责事务...
- 在高并发场景下,需要注意OpenSessionInViewFilter可能会导致的性能问题,因为它使得Session的生命周期变长,增加了Session占用资源的时间。 - 如果项目中同时使用了其他Session管理机制,需要确保它们之间不会...
OpenSessionInView(OSIV)模式是SSH整合中常见的一种优化策略,它在用户的一次HTTP请求过程中保持Hibernate Session,避免了多次打开和关闭Session,减少了N+1查询问题,提高了性能。 **Spring** 是一个全面的企业...
在实际项目中,这样的集成方案可以帮助开发团队快速开发出高效、稳定的Java Web应用,但同时也需要注意版本兼容性、性能优化以及安全问题。例如,Struts2框架在后续版本中修复了一些安全漏洞,因此在使用旧版本时需...
例如,在上面的例子中,`OpenSessionInViewFilter`被配置在`webwork`过滤器之前,这是为了确保在处理Struts2相关的请求之前,Session已经被打开。 #### 单个Session vs 多个Session 当`singleSession`参数设置为`...
为了避免这类问题,通常采用`OpenSessionInViewFilter`来处理懒加载问题。 - **OpenSessionInViewFilter的工作原理**: - **线程绑定**:`OpenSessionInViewFilter`的主要作用是将`HibernateSession`绑定到当前...
同时,配置`OpenSessionInViewFilter`(懒加载过滤器)以处理Hibernate的懒加载问题。接着,配置Struts2的FilterDispatcher,确保所有请求都被Struts2拦截和处理。 最后,`applicationContext.xml`是Spring的核心...
Spring框架还提供了一系列的过滤器来处理Web应用中的请求,例如OpenSessionInViewFilter用于解决Hibernate懒加载问题。 - **OpenSessionInViewFilter**:此过滤器在请求处理开始时打开一个Hibernate会话,在请求...
为了解决这个问题,Spring提供了一个过滤器 `OpenSessionInViewFilter` 或者 `OpenSessionInViewInterceptor`,通常简称为OSIV(Open Session In View)模式。 OSIV模式的核心思想是在Controller层和View层之间保持...
它允许在对象第一次被访问时才加载该对象的相关数据,而不是在创建对象时就加载所有的数据。但是,如果在访问延迟加载的数据时,对应的Hibernate会话已经关闭,则会抛出LazyInitializationException异常。这种异常...
本次讨论将围绕给定的`web.xml`和`struts.xml`配置文件进行深入解析,并结合这些配置文件中的具体内容来阐述相关的知识点。 ## 二、`web.xml`配置分析 ### 2.1 Spring配置 在`web.xml`文件中,首先定义了Spring的...
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter <filter-name>HibernateOpenSession *.action ``` - 这个过滤器的作用是在每个HTTP请求开始时开启一个Hibernate ...
8. **处理Hibernate延迟加载**:使用`OpenSessionInViewFilter`过滤器,确保Session在整个HTTP请求期间保持打开状态,解决懒加载问题。配置过滤器映射到所有.do请求。 9. **处理只读模式异常**:由于...
1. **OpenSessionInViewFilter**:解决 Hibernate 的 Session 在请求处理过程中的生命周期管理问题。 - **问题**:确保在请求处理过程中,同一个线程内有一个且只有一个 Hibernate Session 实例。 - **解决方案**...
- **Hibernate会话管理过滤器**:OpenSessionInViewFilter确保在每个请求的生命周期内保持一个打开的Hibernate Session,从而实现懒加载: ```xml <filter-name>OpenSessionInViewFilter <filter-class>org....
Spring框架下的`OpenSessionInViewFilter`是一个典型例子,只需在`web.xml`中进行配置即可轻松实现。 四、最佳实践与注意事项 - **细粒度控制**:确保Session和事务的控制符合应用的具体需求,避免不必要的资源浪费...
4. 解决OpenSessionInView问题,可以使用OpenSessionInViewFilter或OpenSessionInViewInterceptor,确保在一次HTTP请求中保持Hibernate Session的开放状态,以解决懒加载异常。 Spring的事务管理分为编程式和声明式...
为了解决这个问题,可以添加`OpenSessionInViewFilter`过滤器,确保在视图渲染期间保持session打开。 5. **分页查询的注意事项** - Hibernate4中,如果你在进行分页查询时遇到“ResultSet may only be accessed in...
- 在`web.xml`中设置Spring的`ContextLoaderListener`监听器加载上下文,以及`OpenSessionInViewFilter`过滤器,确保每个请求都有一个打开的Session。 - 配置Struts2的Filter,确保请求匹配`.action`结尾的URL,...
7. **配置OpenSessionInView模式**:在`web.xml`中配置`OpenSessionInViewFilter`,目的是解决在HTTP请求结束后才提交事务导致的懒加载问题。通过在视图渲染阶段保持数据库会话,可以确保所有延迟加载的数据都能正确...