`

OpenSessionInView(非原创)

 
阅读更多

OpenSessionInView(非原创)

一、什么是OpenSessionInView

  在hibernate中使用load方法时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而此时session已关闭,所以就会出现异常。 比较典型的是在MVC模式中,我们在M层调用持久层获取数据时(持久层用的是load方法加载数据),当这一调用结束时,session随之关闭,而我们希望在V层使用这些数据,这时才会迫使load加载数据,我们就希望这时的sessionopen着得,这就是所谓的Open Session In view 。 我们可以filter来达到此目的。下面的代码初步解决了此问题:

  public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain){

  try{

  Session session = ...SessionFactory.getCurrentSeesion(); //得到session对象

  tx = session.beginTransaction(); //开启事务

  chain.doFliter(request,response); //传递给下一个

  tx.commit(); //提交事务

  }catch (Exception e){

  //出现异常,回滚事务

  }

  }

  简析:当请求到达时,会首先被此拦截器拦截,当数据经过获取并在V层显示完毕后,回到此Filter内部,此时提交事务-->关闭session

  二、springosiv解决方案

  OpenSessionInViewFilter [全名:org.springframework.orm.hibernate3.support.OpenSessionInViewFilter]Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开HibernateSession,一直保持这个Session,直到这个请求结束,具体是通过一个Filter来实现的。

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

  有两种方式可以配置实现OpenSessionInView,分别是OpenSessionInViewInterceptorOpenSessionInViewFilter,功能完全相同,只不过一个在web.xml配置,另一个在application.xml配置而已。web.xml里配置的东西的太多的话容易发生冲突,虽然可以调整,但是毕竟多了个麻烦。

  OpenSessionInViewInterceptor配置:

  <beans>

  <bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">

  <property name="sessionFactory">

  <ref bean="sessionFactory"/>

  </property>

  </bean>

  <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

  <property name="interceptors">

  <list>

  <ref bean="openSessionInViewInterceptor"/>

  </list>

  </property>

  <property name="mappings">

  ......

  </property>

  </bean>

  ......

  </beans>

  OpenSessionInViewFilter配置: (此监听器应该在struts2的监听器前面)

  <web-app>

  ......

  <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>*.do</url-pattern>

  </filter-mapping>

  ......

  </web-app>

 

 

 

分享到:
评论

相关推荐

    Spring hibernate opensessioninview

    ### Spring + Hibernate OpenSessionInView 模式的理解和应用 在Java Web开发中,Spring与Hibernate作为两个重要的框架,经常被一起使用来实现业务逻辑与数据持久化的处理。而在使用这两个框架时,为了更好地管理...

    Struts Spring Hibernate 整合 OpenSessionInView 例子

    为了练手培训,给大家准备的 Open Session In View 的简单例子,纯代码,大家可以参考,其中主要说了六部分内容: 1.通过接口编程 2.通过spring注入dao到 action 3.通过 open session in view filter 支持 延迟加载...

    OpenSessionInView项目整合jar包

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

    Open_Session_In_View详解.doc

    ### Open_Session_In_View详解 #### 一、背景与概念 在使用Hibernate进行对象持久化时,经常遇到的一个问题是关于懒加载(lazy loading)的处理。懒加载是一种优化技术,允许在真正需要某个关联对象的数据时才加载...

    第30讲--Spring提供的CharacterEncoding和OpenSessionInView功能

    默认情况下,不同的浏览器和服务器可能会有不同的默认编码设置,这可能导致在处理非ASCII字符时出现乱码。通过在Spring配置中启用CharacterEncodingFilter,并设置为如UTF-8的统一编码,我们可以确保所有请求和响应...

    Spring提供的CharacterEncoding和OpenSessionInView功能

    Spring框架是Java开发中不可或缺的一部分,它为开发者提供了丰富的功能,包括依赖注入、面向切面编程、事务管理等。在处理Web应用时,Spring提供了一些关键特性,如`CharacterEncodingFilter`和`...

    SSH项目整合示例【OpenSessionInView】所用到的jar包

    OpenSessionInView(OSIV)模式是SSH整合中常见的一种优化策略,它在用户的一次HTTP请求过程中保持Hibernate Session,避免了多次打开和关闭Session,减少了N+1查询问题,提高了性能。 **Spring** 是一个全面的企业...

    spring中lazy=“true”的正常读取关联表(用opensessioninview)

    在Spring框架中,`lazy="true"` 是一个重要的特性,用于延迟加载(Lazy Loading)。它主要应用于数据持久层,如Hibernate等ORM框架中,目的是为了提高应用的性能。当一个对象被标记为懒加载时,只有在真正需要访问该...

    关于OpenSessionInViewFilter的学习

    OpenSessionInViewFilter是Spring框架中一个非常重要的组件,主要用于解决数据访问层(DAO)与视图层(View)之间的事务管理问题。...然而,当我们在服务层关闭了Session后,到视图层进行数据填充时,可能会遇到已关闭...

    MyContextLoaderPlugIn.jar

    和Spring中OpenSessionInView由于org.springframework.web.struts.ContextLoaderPlugIn中保存同一个对象的名不同导致openSessionInView失效 稍微修改后在struts-config.xml中使用MyContextLoaderPlugIn.jar包中...

    SSH整合 struts+hibernate+spring

    - **依赖注入**:通过Spring容器在运行时自动装配对象依赖,而非在代码中硬编码,这样可以动态替换依赖对象,降低耦合度。 - **Spring配置文件**:在Spring配置文件中定义Bean及其依赖关系,当需要更换实现类时,...

    SSH整合示例项目 hibernate5.2.3+struts2.5.2+spring4.3.3.zip

    - **二级缓存**:提高数据访问效率,OpenSessionInView模式下配合Spring实现 session级缓存。 **OpenSessionInView模式** OpenSessionInView模式是一种解决数据持久层和Web层之间事务管理的策略。在用户请求到达时...

    HibernateSpring多数据库解决方案.doc

    本方案主要探讨如何在基于Hibernate和Spring框架的环境中实现多数据库的管理,特别是在`OpenSessionInView`模式下的配置。 首先,我们看到在`applicationContext.xml`配置文件中定义了两个数据源,一个用于读操作...

    spring面试题大全

    4. **解决 OpenSessionInView 问题**:在 Web 应用程序中,为了确保每个请求都在同一个 Hibernate Session 内执行,可能会遇到 OpenSessionInView 问题。解决这一问题的方法之一是使用 `OpenSessionInViewFilter` 或...

    struts spring hibernate面试题

    - **openSessionInView**:通过在 web 层设置一个 filter 来保持 session 打开状态,从而支持整个请求周期内的延迟加载。 #### 8. Spring 事务管理方式及特性 - **管理方式**: - **声明式事务**:通过 XML 或...

    收集的struts+spring+hibernate面试题.doc

    - **openSessionInView**:通过在 Web 层添加一个 Filter 来维持 Session 的打开状态,从而支持整个请求过程中的延迟加载。 #### 8. Spring 的事务管理 - **事务管理方式**:支持声明式事务管理和编程式事务管理。...

    hibernate面试题总结

    - **OpenSessionInView**:是一种设计模式,用于Web应用中,通过过滤器在请求开始时打开`Session`,结束时关闭,确保整个请求过程中`Session`可用,从而支持延迟加载。但这种方法可能导致过多的数据库连接,因此也...

    spring面试题大全.doc

    对于OpenSessionInView模式,可以通过`OpenSessionInViewFilter`或`OpenSessionInViewInterceptor`来处理事务和会话范围的问题。 5. **Spring事务管理**: - **TransactionDefinition**:定义事务的属性,如隔离...

    OA项目SSH整合框架

    3,在web.xml中配置 spring 的 OpenSessionInView 过滤器(解决抛LazyInitializationException的问题) 1,配置 &lt;!-- 配置 spring 的 OpenSessionInView 过滤器 --&gt; &lt;filter-name&gt;OpenSessionInView ...

    spring+spingmvc+hibernate整合总结

    OpenSessionInView过滤器在Web请求的整个生命周期内保持一个Hibernate Session,使得在视图渲染阶段也能访问到数据库对象,避免了懒加载异常。 五、配置文件 1. `jdbc.properties`:存放数据库连接信息,如URL、...

Global site tag (gtag.js) - Google Analytics