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

一.OpenSessionInView模式

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

在web.xml中增加过滤器,注意过滤器声明位于struts过滤器之前:
      < filter  >
            <filter-name> OpenSessionInViewFilter</filter-name >
            <filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </filter-class>
      </ filter  >
      < filter-mapping  >
            <filter-name> OpenSessionInViewFilter</filter-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>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值