InvalidDataAccessApiUsageException异常的三个处理方
(2010-04-20 00:46:09)
标签:
杂谈 |
分类: J2EE |
原因一:
这个异常产生的主要原因是DAO采用了Spring容器的事务管理策略,如果操作方法的名称和事务策略中指定的被管理的名称不能够匹配上,spring 就会采取默认的事务管理策略(PROPAGATION_REQUIRED,read only).如果是插入和修改操作,就不被允许的,所以包这个异常
原因二:
在网上搜了一下,其中大多数文章又是提OpenSessionInViewFilter又是提OpenSessionInViewInterce
其实这个异常的提示还是很明确的:在只读模式下(FlushMode.NEVER/MANUAL)写操作不被允许:把你的Session改成FlushMode.COMMIT/AUTO或者清除事务定义中的readOnly标记。
解决方法一:
将web.xml下的
<filter>
中的singleSession值修改为false,即不限制整个过程用同一个session,但缺点是Hibernate Session的Instance可能会大增,使用的JDBC Connection量也会大增,如果Connection Pool的maxPoolSize设得太小,很容易就出问题
解决方法二:
查看srping中事务管理配置:
<bean
id="txProxyTemplate" abstract="true"
看了之后才知道,原来的事务策略的<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和逗号
解决方法三:
HibernateTemplate tmp=getHibernateTemplate();
tmp.setFlushMode(HibernateTemplate.FLUSH_EAGER);