由spring transaction manager管理的“暂停”hibernate会话

时间:2012-07-12 14:02:32

标签: java spring hibernate

有没有办法从线程中删除/暂停当前弹簧管理的hibernate会话,以便可以使用新的会话,然后将原始会话放回到线程上?两者都在使用相同的数据源。

更详细地描述问题。我正在尝试为拥有自己的spring hibernate事务管理的工具创建一个插件。在这个插件中,我想做一些我自己的数据库内容,这是在我们自己的spring事务管理器上完成的。当我当前尝试执行数据库操作时,我们的事务管理器开始抱怨已经使用的不兼容的事务管理器

org.springframework.transaction.IllegalTransactionStateException: Pre-bound JDBC Connection found! HibernateTransactionManager does not support running within DataSourceTransactionManager if told to manage the DataSource itself. It is recommended to use a single HibernateTransactionManager for all transactions on a single DataSource, no matter whether Hibernate or JDBC access.

似乎可以解决这个问题的一种解决方法是在另一个线程中运行我自己的代码,并在继续使用其余代码之前等待它完成。

有没有更好的方式,似乎有点愚蠢/矫枉过正?某种方式暂停当前的hibernate会话,然后打开一个新的会话并重新恢复原始会话。

1 个答案:

答案 0 :(得分:0)

有什么理由不能将当前的事务管理器注入到您的插件代码中吗?两个tx经理听起来像厨房里的厨师太多了。如果您注入了它,那么您应该能够在使用@transactional annotation's传播REQUIRES_NEW属性进行工作之前需要新的会话,请参阅文档以获取示例设置

e.g。

@transactional(propogation = Propogation.REQUIRES_NEW)
public void addXXX(Some class) {
    ...
}

但是这会使用spring PlatformTransactionManager而不是让它休眠以管理会话/事务。