【Spring十】使用OpenSessionInView解决懒加载问题及Spring管理下的session和事务

一.OpenSessionInView模式

在进行三大框架整合的时候,通常会碰到懒加载(报no session 的错误,原因是session提前关闭了,但是由于默认的是懒加载策略,在调用session.load()时,会出错。)问题。为此可以使用OpenSessionInView解决懒加载问题:

在web.xml中增加过滤器,注意过滤器声明位于struts过滤器之前:
      < filter  >
            <filter-name> OpenSessionInViewFilterfilter-name >
            <filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter filter-class>
      filter  >
      < filter-mapping  >
            <filter-name> OpenSessionInViewFilterfilter-name >
            <url-pattern> *.action url-pattern>
      filter-mapping  >
     
     
     
      < filter  >
            <filter-name> struts2 filter-name>
            <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter filter-class>
      filter  >
      < filter-mapping  >
            <filter-name> struts2 filter-name>
            <url-pattern> /* url-pattern>
      filter-mapping  >

流程:
请求url时:
1. OpenSessionInViewFilter{
   doFilter(){
        开启session了
      说明:在查找sessionFactory的时候,名称必须是"sessionFactory"
   }
}

2.执行struts2的核心流程

3.执行struts2过滤器中的finally方法:
    把actionContext清空

4.执行页面
   这个时候session并没有关闭,

5。OpenSesisonInViewFilter
   finally{
        关闭session
   }

二.spring管理的session和spring管理的事务

在hibernate中,当事务提交以后,session 就关闭了。但是当由spring利用aop来管理事务时,情况又如何呢?

1、有OpenSessionInView模式
      (1)、session的关闭和开启不用管,只要session存在,获取数据库的数据就没问题
      (2)、不管事务是否提交,session在执行OpenSessionInViewFilter的finally时才关闭
        说明:session的关闭和事务的提交没有什么关系了
   2、没有OpenSessionInView模式
      (1)、如果当前方法没有事务环境,则调用完this.getHibernateTemplate()的方法时,session关闭了
      (2)、如果当前方法有事务环境,在事务环境中session是不能关闭的,但是当事务方法执行完毕以后session自动关闭了
     判断有没有事务环境是在spring的配置文件中,tx:advice是如何配置的:
            <tx:advice id= "tx" transaction-manager="transactionManager" > 
                <tx:attributes>
                     <tx:method name= "save*" read-only="false" />
                tx:attributes>
            tx:advice>


你可能感兴趣的:(Spring,Hibernate)