原因一:
这个异常产生的主要原因是DAO采用了Spring容器的事务管理策略,如果操作方法的名称和事务策略中指定的被管理的名称不能够匹配上,spring 就会采取默认的事务管理策略(PROPAGATION_REQUIRED,read only).如果是插入和修改操作,就不被允许的,所以包这个异常
原因二:
在网上搜了一下,其中大多数文章又是提OpenSessionInViewFilter又是提OpenSessionInViewInterceptor的,大多云山雾罩、不知所云。(网上提到OpenSessionInViewFilter,因为缺省分配的Session是FlushMode.NEVER的,所以需要在程序中修改自己期望的Mode。收录这篇文章是因为和前一篇文章有关联。)
 
其实这个异常的提示还是很明确的:在只读模式下(FlushMode.NEVER/MANUAL)写操作不被允许:把你的Session改成FlushMode.COMMIT/AUTO或者清除事务定义中的readOnly标记。
 
解决方法一:
将web.xml下的
<filter>
  <filter-name>OpenSessionInViewFilter</filter-name>
  <filter-class>
   org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
  </filter-class>
  <init-param>
   <param-name>singleSession</param-name>
   <param-value>true</param-value>
  </init-param>
 </filter>
中的singleSession值修改为false,即不限制整个过程用同一个session,但缺点是Hibernate Session的Instance可能会大增,使用的JDBC Connection量也会大增,如果Connection Pool的maxPoolSize设得太小,很容易就出问题
解决方法二:
查看srping中事务管理配置:
<bean id="txProxyTemplate" abstract="true"
  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="transactionManager">
   <ref bean="transactionManager" />
  </property>
  <property name="transactionAttributes">
   <props>
    <prop key="find*">PROPAGATION_REQUIRED</prop>
    <prop key="save*">PROPAGATION_REQUIRED</prop>
    <prop key="remove*">PROPAGATION_REQUIRED</prop>
    <prop key="update*">PROPAGATION_REQUIRED</prop>
    <prop key="create*">PROPAGATION_REQUIRED</prop>
    <prop key="add*">PROPAGATION_REQUIRED</prop>
    <prop key="del*">PROPAGATION_REQUIRED</prop>
    <prop key="clear*">PROPAGATION_REQUIRED</prop>
    <prop key="build*">PROPAGATION_REQUIRED</prop>
   </props>
  </property>
 </bean>
看了之后才知道,原来的事务策略的<prop key="*">PROPAGATION_REQUIRED</prop>被删除后,bumenAuth()方法后忘了修改,所以导致报上述的错误
子方法1:
将此方法修改为update或者build,add....等上述策略名称开头的方法:如:updateBumenAuth()
子方法2:
增加<prop key="*">PROPAGATION_REQUIRED</prop>即可
子方法3:
如果是:<prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
那么去掉readOnly和逗号
解决方法三:
     Java代码
HibernateTemplate tmp=getHibernateTemplate();
tmp.setFlushMode(HibernateTemplate.FLUSH_EAGER);
  只要在调用HibernateTemplate涉及到写操作的方法之前正确设置了HibernateTemplate或者Session的刷新模式,则上述异常不会再抛出。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐