当前位置: 首页 > 知识库问答 >
问题:

如何在事务边界后关闭Hibernate会话

上官淮晨
2023-03-14

我们正试图从Spring3/冬眠3升级到Spring4/冬眠4。我们看到的一个问题是,在Hibernate3中,当实体从服务方法周围有事务边界的服务层提取时,实体没有针对延迟加载属性的活动打开会话。事务管理器过去调用SpringSessionSynchronization的afterCompletion来取消设置所有会话。

现在有了spring4Hibernate4组合,我们看到实体带着活跃的开放会话回来了。事务管理器现在调用的是Spring同步,而不是Spring会话同步,后者在执行提交后不执行任何操作。因此,现在发生的事情是,当具有旧会话的实体被传递到具有单独事务边界的另一个服务调用时,它遇到了错误:

Illegal attempt to associate a collection with two open sessions

注意,如果相关的话,事务管理器在我的例子中使用了JTA。Spring现在的工作方式是否发生了一些变化,导致了这种行为上的变化——有解决这个问题的方法吗?

共有1个答案

强宾白
2023-03-14

我的问题是我没有设置JTATransactionFactory。将其添加到Hibernate配置中解决了我的问题:

            <prop key="hibernate.current_session_context_class">jta</prop>
            <prop key="hibernate.transaction.jta.platform">org.hibernate.engine.transaction.jta.platform.internal.BitronixJtaPlatform</prop>
            <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</prop>                
 类似资料:
  • 如果我没有捕捉到运行时异常,我就不会得到hibernate异常(不要刷新会话..)

  • 问题内容: 我正在尝试通过以下示例来消除我对Spring Transaction边界的怀疑。 我想将test2()方法与test1()隔离开,即每次调用test()时,test2()都不应读取test1()提交的数据。请建议是否可以使用传播或隔离属性来处理这种情况。 提前致谢。 问题答案: 事务属性应用于外部调用,而不是由bean方法(例如您的案例)进行的内部调用。如果要将事务边界应用于调用,则应

  • 我有一个关于ApacheCamel的问题。我无法找到多播是否被事务处理。如果它被事务处理,事务是如何实现的?事务边界是什么?

  • 我有下面的方法,每隔几秒钟插入一大批记录。运行一段时间后,我得到如下错误: 错误:通信链接失败 从服务器成功接收的最后一个数据包是523毫秒前。上次成功发送到服务器的数据包是8毫秒前。 May 16, 2013 9:48:30 AM com.mchange.v2.c3p0.stmt.GooGooStatementCache checkinStatement INFO: 签入语句问题,丢弃。 com

  • 我对Hibernate中的会话和事务的概念有点困惑。据我所知,Hibernate使用会话(持久性上下文),它基本上是需要持久,删除或数据库中任何内容的实体的缓存。会话封装事务,因此我启动一个会话,然后创建一个事务。事务关闭后,持久性上下文中的所有内容都将刷新到数据库,如果我关闭会话,也会发生同样的事情。 为什么我需要两者?我可以在不创建交易的情况下做同样的事情吗?

  • 我如何在上根据搜索的城市绘制边界线,如图中显示搜索的城市地图的红线所示? 我看到了各种链接,但找不到解决办法。 谢啦