[解决]Spring与hibernate整合出现的某些Exception

HibernateException: Illegal attempt to associate a collection with two open sessions.

字面意思就是:试图把一个collection与两个已打开的session做关联。

解决:因为我用spring接管了事务管理,配置了OpenSessionInViewFilter的,这里有个配置参数是:singleSession,需要设置成:true,也就是单个session啦(原来我是配置成false,所以才会有两个session的情况)

但是经过上面的修改后,又出现了另一个问题:

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.

字面意思就是:在自读模式下的session,是不能做写操作的。

解决思路:

首先,我想,是不是哪里可以修改这个呢?试了在配置OpenSessionInViewFilter的时候,再配置flushMode为AUTO,但是报NoSuchMethod之类的错;

然后,我试着在我写的一个DAO实现类(继承了HibernateDaoSupport)里的构造函数里直接设置flushMode的值,但是报NullPoint的错;

怎么回事呢?究竟在哪里还可以改呢?无奈,上网搜索一番。。。

经过一番波折,结合自己的测试与判断,最后找到了解决方法和原因:首先,因为现在是spring在管理事务了,它有自己的一种判断事务边界的方式,某些不需要做事务管理的,就提供一个只读的session环境(这种说法不是很贴切),然后我使用的方式里,是只对service的某些方法做事务管理,而刚好我调用后出问题的service方法没有要求做事务管理,所以就出现上面的问题了。解决方法就是: 在配置spring事务拦截属性的时候,把需要事务管理的方法增加上去即可,比如部分配置内容如下:

<!-- 事务   拦截 -->
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>

<!--
配置事务属性 下面是需要做事务的方法前缀,记得把需要事务的方法配置在这里,不然可能会出现错误: Write operations are
not allowed in read-only mode (FlushMode.NEVER) - turn your Session
into FlushMode.AUTO or remove 'readOnly' marker from transaction
definition
-->
<property name="transactionAttributes">
<props>
<prop key="test*">PROPAGATION_REQUIRED</prop>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="find*">PROPAGATION_REQUIRED</prop>
<prop key="list*">PROPAGATION_REQUIRED</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>

在解决这个问题的过程中,这篇文章《Spring OpenSessionInViewFilter closeSessionIfNecessary》给了我启发!

» 本文链接地址:https://www.xidige.com/192

打开支付宝扫一扫,即可进行扫码打赏哦

扫码支持
扫码打赏,你说多少就多少

标签:

分享到:

扫一扫 在手机阅读、分享本文

上一篇: 下一篇:
评论区0人评论127人参与

电子邮件地址不会被公开。 必填项已用*标注

*

loading

赞助商广告