Hibernate使用旧的封闭SessionImpl而不是给定的SessionImpl

我遇到了Hibernate Enverse(版本5.2.0-Final)的问题 .

Context: 我正在审核一些有些懒惰关系的实体 . 我有一个jsf页面加载一个实体的一个版本与该版本的所有关系 . 这很好 . 所以现在我有一个页面,显示该实体的修订版本与该修订版本的所有关系 . 在这个页面上,我可以打开一个触发AJAX的字段集 . 在此请求中,我们通过调用 entityManager.merge(entity) 来重新附加所有关系,以便能够获取此字段集中的惰性关系 . (EntityManager是RequestScoped)

The Problem: AJAX是一个新请求 . 服务器调用 entityManager.merge(entity) ,强制创建新的EntityManager(因此创建了一个新的 org.hibernate.internal.SessionImpl ) . 在这个对象上,hibernate调用 SessionImpl.merge(...) . 但是在方法 org.hibernate.internal.AbstractSharedSessionContract.createQuery(String) 中,使用了另一个SessionImpl对象,该对象在之前的请求中已经关闭 . 这强制执行 java.lang.IllegalStateException: Session/EntityManager is closed .

In one sentence :虽然创建了一个新的entityManager并且在该新的entityManger上调用了一个merge,但Hibernate之前使用了一个旧的Session / EntityManager .

我调试了问题,发现如下:

  • Debug1:使用会话的对象ID显示 SessionImpl.merge(...) 的Stacktrace

  • Debug2:显示具有正确SessionImpl对象的最后一个方法(参见它的id) . 在下一个方法中不使用此对象 .

  • Debug3:Debug2之后的步骤不知道给定的SessionImpl对象 . 它在 collection.initializor.versionsReader 中有自己的SessionImpl对象 . 此会话在请求之前(在加载页面时)创建并关闭 .

  • Debug4:现在Hibernate想要用关闭的SessionImpl创建查询

  • Debug5:这会在会话关闭时强制执行异常 .

My questions

  • 这是Hibernate的错误吗?

  • 为什么方法 org.hibernate.type.CollectionType.getElementIterater(...) 中给定的SessionImpl没有使用?

  • 任何人都知道这个问题的解决方案或解决方法?

坦克你非常想要任何想法 . 我花了几天时间来处理这个bug .

回答(0)