我们正在尝试从Spring3 / Hibernate3升级到Spring4 / Hibenate4。我们看到的一个问题是,对于Hibernate3,当从服务层获取实体并且服务方法周围有事务边界时,实体没有用于延迟加载属性的活动打开会话。事务管理器用于调用 SpringSessionSynchronization 的afterCompletion来取消设置所有会话。
现在有了spring4 + hibernate4组合,我们看到实体回来时会有活跃的开放会话。事务管理器现在调用 SpringFlushSynchronization 而不是SpringSessionSynchronization,它在执行提交后不执行任何操作。那么现在发生的事情是,当具有旧会话的实体被传递到具有单独事务边界的另一个服务调用时,错误会遇到它:
Illegal attempt to associate a collection with two open sessions
请注意,如果相关,事务管理器在我的情况下使用JTA。 Spring现在的工作方式是否存在一些变化,导致行为发生这种变化 - 是否有解决问题的补救措施?
答案 0 :(得分:1)
我的问题是我没有设置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>