当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中延长hibernate中session的生命周期:OpenSessionInViewFilter

在HIBERNATE中,如果我们要访问到某个类的集合属性,那我们一般在类的的映射文件里SET节点启用LAZE=FALSE; 那么在S2SH中怎么解决呢? 1.OpenSessionInView...

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

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

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

hibernate opensessioninviewfilter

hibernate延迟加载: 一个person对应多个school,使用hibernate处理关联关系: T_PERSON表: id name age ...

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

假设在你的应用中Hibernate是通过spring 来管理它的session.如果在你的应用中没有使用OpenSessionInViewFilter或者 OpenSessionInViewInter...

OpenSessionInViewFilter解决Hibernate延时加载问题

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

spring对session和事务的管理以及OpenSessionInViewFilter是如何工作的

为了弄清楚spring对session和事务的管理以及OpenSessionInViewFilter是如何工作的,可监控以下类的日志:org.springframework.orm.hibernate...

由OpenSessionInViewFilter报错引出的spring3.0事务配置问题及解决办法

转自:http://www.javaeye.com/topic/737741 开发环境 IDE: eclipse3.4 FrameWork: spring3.0 + spring m...

spring配置文件中声明式事务和OpenSessionInViewFilter深入研究和汇总

spring中配置文件可以配置声明式事务管理以及OpenSessionInViewFilter, 一、1、对于声明式事务的配置作用是在配置有事务的方法上起作用,spring接管此方法内的数据库事务管...

(OpenSessionInView模式)spring对session和事务的管理以及OpenSessionInViewFilter是如何工作的

为了弄清楚spring对session和事务的管理以及OpenSessionInViewFilter是如何工作的,可监控以下类的日志:   org.springframework.orm.hiber...

spring 的OpenSessionInViewFilter简介

spring 的OpenSessionInViewFilter简介 假设在你的应用中Hibernate是通过spring 来管理它的session.如果在你的应用中没有使用OpenSessionIn...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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