最近在配置 Structs, spring 和hibernate整合的問題:java
開啓OpenSessionInViewFilter來阻止延遲加載的錯誤的時候拋出了這個異常:web
org.springframework.dao.InvalidDataAccessApiUsageException錯誤spring
可是在咱們開啓OpenSessionInViewFilter這個過濾器的時候FlushMode就已經被默認設置爲了MANUAL!數據庫
若是FlushMode是MANUAL或NEVEL,在操做過程當中 hibernate會將事務設置爲readonly,因此在增長、刪除或修改操做過程當中會出現以下錯誤:express
org.springframework.dao.InvalidDataAccessApiUsageException:session
Write operations are not allowed in read-only mode (FlushMode.NEVER) turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition;app
解決辦法1:url
直接修改OpenSessionInViewFilter過濾器的配置,配置過濾器的時候配置就是在通常的配置裏面加上下面藍色部分就能夠了,直接指定flushMode的配置就OK了:spa
下面是配置文件:(web.xml).net
<filter> <filter-name>OpenSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> <init-param> <param-name>flushMode</param-name> <param-value>AUTO</param-value> </init-param> </filter> <filter-mapping> <filter-name>OpenSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
解決方法2:
就是配置事務的邊界,在你方法的執行時配置事務邊界!
下面是sessionFactor.xml配置:
<!-- 事務的配置 --> <!-- sessionFactory 爲本身配置 sessionFactory 的 bean--> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <aop:config> <!-- execution(public * *.*.*..*.*(..)) 爲本身項目中操做數據庫中的方法 --> <aop:pointcut id="**" expression="execution(public * *.*.*..*.*(..))" /> <aop:advisor pointcut-ref="**" advice-ref="txAdvice" /> </aop:config> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <!-- name 爲 方法名 --> <tx:method name="**" read-only="true" /> <tx:method name="**" propagation="REQUIRED"/> </tx:attributes> </tx:advice>
下面是總結:
原理:由於配置openSessionInView時,啓動後他默認是給沒有配置事務邊界的方法都默認爲只讀的,因此在插入數據時就會報上面的錯
若是出現該錯誤,檢查事務邊界配置是否正確
原文地址:http://blog.csdn.net/enterys/article/details/7927840