0

有什么方法可以从线程中删除/暂停当前的 spring 管理的休眠会话,以便可以使用新的会话,然后将原始会话放回线程上?两者都在同一个数据源上工作。

更详细地描述问题。我正在尝试为拥有自己的 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.

似乎可以解决问题的一种解决方法是在不同的线程中运行我自己的代码并等待它完成,然后再继续执行其余代码。

有没有更好的方法,看起来有点愚蠢/矫枉过正?以某种方式暂停当前休眠会话,然后打开一个新会话,然后恢复原始会话。

4

1 回答 1

0

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

例如

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

但这将使用springPlatformTransactionManager而不是让它休眠来管理会话/事务。

于 2012-07-12T14:18:18.403 回答