当hibernate遇上spring(OpenSessionInViewFilter)

原创 2011年01月13日 16:35:00

 hibernate的延迟问题

环境strut1.x+spring+hibernate

 

Hibernate允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行。如果 Service 层返回一个启用了延迟加载功能的领域对象给 Web 层,当Web 层访问到那些需要延迟加载的数据时,由于加载领域对象的 Hibernate Session 已经关闭,这些导致延迟加载数据的访问异常。

Spring为我们提供的OpenSessionInViewFilter过滤器为我们很好的解决了这个问题。OpenSessionInViewFilterSpring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开HibernateSession,一直保持这个Session,直到这个请求结束,具体是通过一个Filter来实现的。

  由于Hibernate引入了Lazy Load特性,使得脱离HibernateSession周期的对象如果再想通过getter方法取到其关联对象的值,Hibernate会抛出一个LazyLoadException。所以为了解决这个问题,Spring引入了这个Filter,使得HibernateSession的生命周期变长。

 有两种方式可以配置实现OpenSessionInView,分别是OpenSessionInViewInterceptorOpenSessionInViewFilter,功能完全相同,只不过一个在web.xml配置,另一个在application.xml配置。

但是,使用SSH架构的项目很有可能都遇到过openSessionInView失效问题原因是因为加载spring配置文件都是通过springstruts插件来实现,即在struts的配置文件中通过ContextLoaderPlugIn在加载spring的上下文配置文件:

<plug-in

className="org.springframework.web.struts.ContextLoaderPlugIn">

<set-property property="contextConfigLocation"

value="/WEB-INF/applicationContext.xml, 

/WEB-INF/action-servlet.xml"/>

</plug-in>

通过上面的org.springframework.web.struts.ContextLoaderPlugIn作为strutsplugin来加载spring的配置文件,会绕过openSessionInView,从而使得openSessionInView失效。

因此,使用org.springframework.web.context.ContextLoaderListener来加载spring的配置文件。

解决方法:

首先:将在struts配置文件中的加载spring的配置文件(下面的代码)删掉。

<plug-in

className="org.springframework.web.struts.ContextLoaderPlugIn">

<set-property property="contextConfigLocation"

value="/WEB-INF/applicationContext.xml, 

/WEB-INF/action-servlet.xml"/>

</plug-in>

其次web.xml文件中加入

  <context-param>

    <param-name>contextConfigLocation</param-name>

        <param-value>/WEB-INF/applicationContext*.xml,classpath*:applicationContext*.xml</param-value>

  </context-param>

 

  <listener>

        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

  </listener> 

 

  <filter>

    <filter-name>hibernateFilter</filter-name>

    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>

    <init-param> 

        <param-name>singleSession</param-name> 

        <param-value>true</param-value> 

    </init-param>

  </filter>

  <filter-mapping>

    <filter-name>hibernateFilter</filter-name>

    <url-pattern>/*</url-pattern>

</filter-mapping>

即可。

PS

openSessionInView就是把session关闭延迟到view渲染以后,结合延迟加载产生作用,如果不使用延迟加载也就没有必要使用openSessionInView了。

如果使用Struts,那么需要在Struts的配置文件struts-config.xml里面配置一个SpringpluginContextLoaderPlugIn。实际上ContextLoaderListenerContextLoaderPlugIn的功能是重叠的,他们都是进行Spring配置的初 始化工作的。因此,如果你不打算使用OpenSessionInView,那么你并不需要在web.xml里面配置 ContextLoaderListener 如果需要OpenSessionInView模式,由于ContextLoaderListenerContextLoaderPlugIn功能重叠,都是初始化Spring,你不应该进行两次初始化,所以你不应该同时使用这两者,为了使得OpenSessionInView起作用,应该使用ContextLoaderListener

 

spring  有三种启用模式:

1.ContextLoaderServlet

2.ContextLoaderListener

3.ContextLoaderPlugIn

 

 

参考:http://www.javaeye.com/topic/73332

http://fusu.com.cn/post/24.html

http://www.javaeye.com/topic/15057

http://blog.csdn.net/dongyansheng_max/archive/2009/07/29/4390978.aspx

http://www.cnblogs.com/cxccbv/archive/2009/07/22/1528825.html


Spring MVC @Transactional注解方式事务失效的解决办法

由于web.xml中配置: spring-dispatcher org.springframework.web.servlet.DispatcherServlet ...
  • yulong_1988
  • yulong_1988
  • 2016年12月31日 21:47
  • 1415

OpenSessionInViewFilter 的配置及替代方案

Spring 为我们提供了一个叫做 OpenSessionInViewFilter 的过滤器,他是标准的 Servlet Filter 所以我们把它按照规范配置到 web.xml 中方可使用。使用中我...
  • z69183787
  • z69183787
  • 2013年12月05日 09:48
  • 1553

Spring MVC 4 文件上传下载 Hibernate+MySQL例子 (带源码)

【本系列其他教程正在陆续翻译中,点击分类:spring 4 mvc 进行查看。源码下载地址在文章末尾。】 【翻译 by 明明如月 QQ 605283073】 下载地址:http://websys...
  • w605283073
  • w605283073
  • 2016年05月07日 21:58
  • 4716

spring中延长hibernate中session的生命周期:OpenSessionInViewFilter

在HIBERNATE中,如果我们要访问到某个类的集合属性,那我们一般在类的的映射文件里SET节点启用LAZE=FALSE; 那么在S2SH中怎么解决呢? 1.OpenSessionInView...
  • mafly008
  • mafly008
  • 2013年08月29日 19:00
  • 1418

Spring使用OpenSessionInViewFilter解决Hibernate的lazy延时加载问题

Spring为我们解决最让人头痛的难题之一,Hibernate的Session的关闭与开启问题。 当hibernate+spring配合使用的时候,如果设置了lazy=true,那么在读取数据的时候...
  • guoquanyou
  • guoquanyou
  • 2011年08月18日 13:34
  • 9016

hibernate opensessioninviewfilter

hibernate延迟加载: 一个person对应多个school,使用hibernate处理关联关系: T_PERSON表: id name age ...
  • DragonSoulhyt
  • DragonSoulhyt
  • 2014年03月21日 14:38
  • 454

org.springframework.orm.hibernate3.support.OpenSessionInViewFilter详解

假设在你的应用中Hibernate是通过spring 来管理它的session.如果在你的应用中没有使用OpenSessionInViewFilter或者 OpenSessionInViewInter...
  • muxiayayoumei
  • muxiayayoumei
  • 2015年12月01日 16:50
  • 295

OpenSessionInViewFilter解决Hibernate延时加载问题

一、搭建项目环境1、创建一个动态web项目; 2、导入jar包(SSH、spring依赖、日志、数据库驱动); 3、配置web.xml(struts2的过滤器、spring监听器、解决Hibern...
  • xiaokang123456kao
  • xiaokang123456kao
  • 2017年06月06日 16:59
  • 254

Spring 4.16: OpenSessionInViewFilter 的配置及作用

spring为我们解决hibernate的Session的关闭与开启问题。Hibernate 允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session...
  • FANGAOHUA200
  • FANGAOHUA200
  • 2016年12月12日 20:27
  • 565

spring,web.xml中的OpenSessionInViewFilter 配置

web.xml原始配置:       hibernateFilter       org.springframework.orm.hibernate3.support.OpenSession...
  • ynztpwl
  • ynztpwl
  • 2011年08月19日 13:47
  • 2564
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:当hibernate遇上spring(OpenSessionInViewFilter)
举报原因:
原因补充:

(最多只允许输入30个字)