【问题标题】:"suspend" hibernate session managed by spring transaction manager“暂停”由 Spring 事务管理器管理的休眠会话
【发布时间】:2012-07-12 14:02:31
【问题描述】:

有没有办法从线程中删除/暂停当前的 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.

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

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

【问题讨论】:

    标签: java spring hibernate


    【解决方案1】:

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

    例如

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

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

    【讨论】:

    • 这样做的问题是他们用自己的代码段包装了 sessionfactory 和 transactionmanager。另一个问题是我们无法将我们的 hbm 映射添加到他们的事务管理器
    • spring 事务管理器封装了一些自己的编码
    • 如果它是一个弹簧管理的 bean 并且它实现了 PlatformTransactionManager 自动连接应该可以解决问题。如果它没有实现接口,你(或他们)将不得不编写某种特定于应用程序的adapter
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 2013-04-30
    • 2011-11-16
    • 1970-01-01
    • 2017-05-09
    • 2015-10-31
    • 1970-01-01
    相关资源
    最近更新 更多