spring +struts + hibernate 时事务配置注意的问题
当 spring 里配置有 < aop:aspectj-autoproxy /> 也就是对 spring 里配置的 bean 生成代理( java 反射机制和动态代理),以便切面通知
当连接点(方法的执行)退出时,自动代理的对象将会关闭 session ,也就是不能初始化代理,会出现这样的情况比如: hibernate 里配置对象关联,当在连接点加载了一个对象,然后在连接点之后访问另一个对象时(除 ID ), spring 就会抛出:不能初始化代理, no session ,
为了解决这样的问题, spring 引入了 openSessionInViewFilter 过滤器,在 web.xml 配置如下:
< filter >
< filter-name > openSessionInViewFilter </ filter-name >
< filter-class >
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</ filter-class >
< init-param >
< param-name > singleSession </ param-name >
< param-value > false </ param-value >
</ init-param >
</ filter >
< filter-mapping >
< filter-name > openSessionInViewFilter </ filter-name >
< url-pattern > /* </ url-pattern >
</ filter-mapping >
注意其中的:
< param-name > singleSession </ param-name >
< param-value > false </ param-value >
配置,默认这个设置是 true, 也就是一个 request 的开始到一个 response 的结束,只用一个 session 来处理 , 而我们配置的切面,只是到 service 层,并没有到 aciton( 注意,我们的 action 通常也是配置为 spring 的 bean), 而在 service 层动态代理已经是关闭了,这样,当你要访问对象关联里其他对象的属性时, spring 同样会抛出:不能初始化代理, no session ,这样我们只要把上面的 true 改为 false ,当访问关联对象时, spring 会打开新的一个 session 来处理,这样也不会对我们的 service 层里的事务造成影响,我们的 service 同样还是使用相同的 session,
我在 hibernate.properties 里的配置是:
hibernate.connection.release_mode after_transaction