一.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清空
把actionContext清空
4.执行页面
这个时候session并没有关闭,
这个时候session并没有关闭,
5。OpenSesisonInViewFilter
finally{
关闭session
}
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>
|