0

给定两行代码:

entityManager.find(MyEntity.class, myId);

((Session) getEntityManager().getDelegate()).load(MyEntity.class, myId);

第一条指令工作正常,但第二条指令抛出 org.hibernate.SessionException: Session is closed!。任何想法 ?

上下文:春季批处理 3.0.6 / 休眠 3.5.0

信息:EntityManager 被注入:

@PersistenceContext
protected EntityManager entityManager;

更新 1

如果会话为空(在 EntityManagerImpl.getRawSession 中),我可以在 find 方法中看到一个调用 this.getSession() 打开一个新会话

更新 2

在第二种情况下,不会调用 getSession 方法,而是调用一个名为 SharedEntityManagerCreator 的类来关闭会话:

if(isNewEm) {
  EntityManagerFactoryUtils.closeEntityManager(target1);
}
4

1 回答 1

1

通过适当的 JPA 事务管理,底层 HibernateSession应该已经打开。@Transactional如果您正在使用声明性事务管理(底层事务管理器应该是 JPA 感知的),请确保您注释您的服务方法。如果您不使用声明式事务管理,您可以调用

entityManager.getTransaction().begin();

不要忘记在完成时commit()rollback()完成时关闭交易。

于 2016-03-17T22:06:20.353 回答