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



我们正在尝试从Spring3/Hibernate 3升级到Spring4/Hibernate4。我们看到的一个问题是,使用Hibernate 3,当从服务层提取实体时,在服务方法周围有事务边界,实体没有用于延迟加载属性的活动打开会话。事务管理器用于调用SpringSessionSynchronization的afterCompletion,该afterComplete取消设置所有会话。

现在有了spring4+hibernate4组合,我们看到实体会带着活跃的开放会话回来。事务管理器现在调用SpringFlushSynchronization,而不是执行提交后不执行任何操作的SpringSessionSynchronization。因此,现在发生的情况是,当具有旧会话的实体被传递给具有单独事务边界的另一个服务调用时,会出现以下错误:

Illegal attempt to associate a collection with two open sessions

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

我的问题是没有设置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>                

最新更新