2012-07-12 129 views
0

有什么办法从线程中删除/挂起当前的spring管理的hibernate会话,以便可以使用新会话,然后将原始会话放回线程?两者都在研究相同的数据源。“暂停”由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.

,似乎这样的伎俩运行自己的代码在不同的线程和等待解决办法在继续执行其他代码之前完成。

那么有没有更好的办法,看起来有点愚蠢/矫枉过正?一些暂停当前休眠会话的方法,然后打开一个新的会话并恢复原来的会话。

回答

0

是否有任何理由不能将当前事务管理器注入到您的插件代码中?两个tx经理听起来像厨房里有太多厨师。如果您已将其注入,则在使用@transactional annotation's传播REQUIRES_NEW属性参阅文档以查看示例设置

例如,您应该能够在进行工作之前需要新会话。

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

但这将使用Spring的PlatformTransactionManager,而不是留给了Hibernate来管理会话/事务。

+0

这样做的问题是,他们用自己的代码段包装sessionfactory和transactionmanager。另一个问题是,我们没有任何方法将我们的hbm映射添加到他们正在使用hibernate事务管理器的事务管理器 – user1344117 2012-07-13 05:04:55

+0

中? – 2012-07-13 13:19:04

+0

spring事务管理器用自己编写的一些代码包装 – user1344117 2012-07-17 08:11:48