1、 问题描述
Spring与Hibernate集成,且在web.xml中配置OpenSessionInViewFilter,目的是解决懒加载问题
<!-- 解决Lazy Initial Exception问题 -->
<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>*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
会开启OpenSessionInViewFilter来阻止延迟加载的错误,但是在我们开启OpenSessionInViewFilter这个过滤器的时候FlushMode就已经被默认设置为了MANUAL,如果FlushMode是MANUAL或NEVEL,在操作过程中 hibernate会将事务设置为readonly,所以在增加、删除或修改操作过程中会出现异常
Write operations are not allowed in read-onlymode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO orremove 'readOnly' marker from transaction definition.
如果方法没有被Spring事务管理器所管理到,默认的话事务是只读模式
解决方法:
我的Spring事务配置:
<aop:config proxy-target-class="true">
<aop:pointcut id="transactionOperation"
expression="execution(* com.pan.service.*.impl.*.*(..)) "/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="transactionOperation"order="1"/>
</aop:config>
经过多次实践,我改成
<aop:config proxy-target-class="true">
<aop:pointcut id="transactionOperation"
expression="execution(* com.pan.service.*.impl.*.*(..)) || execution(* com.pan.dao.*.impl.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="transactionOperation"order="1"/>
</aop:config>
增加了对dao层的管理,这样的话就不会发生异常了