Java &引用;暂停;由spring事务管理器管理的hibernate会话

Java &引用;暂停;由spring事务管理器管理的hibernate会话,java,spring,hibernate,Java,Spring,Hibernate,有没有办法从线程中删除/挂起当前的spring管理的hibernate会话,以便使用新会话,然后将原始会话放回线程?两者都在同一个数据源上工作 更详细地描述问题。我试图为一个拥有自己的SpringHibernate事务管理的工具创建一个插件。在这个插件中,我想做一些我自己的数据库工作,这些工作是在我们自己的spring事务管理器上完成的。当我当前尝试执行数据库操作时,我们的事务管理器开始抱怨已经在使用不兼容的transactionmanager org.springframework.trans

有没有办法从线程中删除/挂起当前的spring管理的hibernate会话,以便使用新会话,然后将原始会话放回线程?两者都在同一个数据源上工作

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

org.springframework.transaction.IllegalTransactionStateException:找到预绑定的JDBC连接!如果要求HibernateTransactionManager管理数据源本身,则HibernateTransactionManager不支持在数据源TransactionManager中运行。建议对单个数据源上的所有事务使用单个HibernateTransactionManager,无论是Hibernate还是JDBC access。

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


有没有更好的方法,看起来有点愚蠢/过分?挂起当前hibernate会话,然后打开一个新会话,afterworths恢复原始会话。

有什么原因不能将当前事务管理器注入插件代码?两个tx经理听起来好像厨房里的厨师太多了。如果您已将其注入,那么您应该能够在使用“传播要求”新属性执行工作之前要求新会话。有关示例设置,请参阅文档

e、 g


但这将使用spring而不是让hibernate来管理会话/事务

这样做的问题是,它们用自己的代码片段包装sessionfactory和transactionmanager。另一个问题是,我们没有任何方法将hbm映射添加到他们的事务管理器spring事务管理器中,如果它是一个spring管理的bean,并且它实现了
PlatformTransactionManager
auto wiring,那么就应该实现这一点。如果它没有实现接口,您(或他们)将不得不编写某种特定于应用程序的代码。
@transactional(propogation = Propogation.REQUIRES_NEW)
public void addXXX(Some class) {
    ...
}