Hibernate整合Spring出現寫操作在只讀事物中的問題
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</
<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層的管理,這樣的話就不會發生異常了