国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
Write operations are not allowed in read-only mode
關(guān)鍵字: spring hibernate 事務(wù)管理

HibernateDaoSupport的子類在保存實(shí)體時(shí)拋出InvalidDataAccessApiUsageException異常,異常堆棧如下:

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
 at org.springframework.orm.hibernate3.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1090)
 at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:629)
 at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:367)
 at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:627)

在網(wǎng)上搜了一下,其中大多數(shù)文章又是提OpenSessionInViewFilter又是提OpenSessionInViewInterceptor的,大多云山霧罩、不知所云。

其實(shí)這個(gè)異常的提示還是很明確的:在只讀模式下(FlushMode.NEVER/MANUAL)寫(xiě)操作不被允許:把你的Session改成FlushMode.COMMIT/AUTO或者清除事務(wù)定義中的readOnly標(biāo)記。

首先看一下我Spring的配置文件,為了減少篇幅,僅將與事務(wù)有關(guān)的一部分貼在下面:

Xml代碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  3. <beans>  
  4.     <!-- Transaction template for Managers, from:   
  5.         http://blog.exis.com/colin/archives/2004/07/31/concise-transaction-definitions-spring-11/ -->  
  6.     <bean id="txProxyTemplate" abstract="true"    
  7.         class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">  
  8.         <property name="transactionManager">  
  9.             <!--org.springframework.orm.hibernate3.HibernateTransactionManager的Bean實(shí)例-->  
  10.             <ref bean="gkgltransactionManager" />  
  11.         </property>  
  12.         <property name="transactionAttributes">  
  13.             <props>  
  14.                 <prop key="save*">PROPAGATION_REQUIRED</prop>  
  15.                 <prop key="remove*">PROPAGATION_REQUIRED</prop>  
  16.                 <prop key="do*">PROPAGATION_SUPPORTS</prop>    
  17.                 <prop key="auto*">PROPAGATION_SUPPORTS</prop>  
  18.                 <!--對(duì)于其它方法要求事務(wù)并且是只讀的-->  
  19.                 <prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>  
  20.             </props>  
  21.         </property>  
  22.     </bean>  
  23.     <!-- Generic manager that can be used to do basic CRUD operations on any objects -->  
  24.     <bean id="manager" parent="txProxyTemplate">  
  25.         <property name="target">  
  26.             <bean class="com.neuqsoft.base.service.impl.BaseManager">  
  27.                 <property name="dao">  
  28.                     <ref bean="gkgldao" />  
  29.                 </property>  
  30.             </bean>  
  31.         </property>  
  32.     </bean>  
  33. </beans>  

  對(duì)于清除readOnly標(biāo)記是很簡(jiǎn)單的,只需把上述配置文件中txProxyTemplate Bean定義中的<prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>中的readOnly及其前面的逗號(hào)去掉即可。

接下來(lái)我們討論把Session改成FlushMode.COMMIT/AUTO,下面是HibernateTemplate中checkWriteOperationAllowed方法的源碼:

Java代碼
  1. protected void checkWriteOperationAllowed(Session session) throws InvalidDataAccessApiUsageException {   
  2.         if (isCheckWriteOperations() && getFlushMode() != FLUSH_EAGER &&   
  3.                 session.getFlushMode().lessThan(FlushMode.COMMIT)) {   
  4.             throw new InvalidDataAccessApiUsageException(   
  5.                     "Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): "+   
  6.                     "Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.");   
  7.         }   
  8.     }  

 通過(guò)閱讀這段代碼我們不難看出,在Java代碼中調(diào)用HibernateTemplate的save或者saveOrUpdate等涉及到寫(xiě)操作的方法之前需要把Session的刷新模式設(shè)置為FlushMode.COMMIT或更高的級(jí)別,或者把HibernateTemplate的刷新模式設(shè)置為FLUSH_EAGER,由于我們的Dao繼承自HibernateDaoSupport,所以設(shè)置Session刷新模式的語(yǔ)句如下:getSession().setFlushMode(FlushMode.COMMIT);

而設(shè)置HibernateTemplate刷新模式的語(yǔ)句如下:

Java代碼
  1. HibernateTemplate tmp=getHibernateTemplate();      
  2. tmp.setFlushMode(HibernateTemplate.FLUSH_EAGER);    

 只要在調(diào)用HibernateTemplate涉及到寫(xiě)操作的方法之前正確設(shè)置了HibernateTemplate或者Session的刷新模式,則上述異常不會(huì)再拋出。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
spring配置 no matching editors or conversion strategy found 異常解決方案
關(guān)于OpenSessionInView
spring的那些事兒
Spring?的OpenSessionInViewFilter簡(jiǎn)介
spring+ibatis事務(wù)配置
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服