1. 程式人生 > >Hibernate整合Spring出現寫操作在只讀事物中的問題

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</

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層的管理,這樣的話就不會發生異常了