给出两行代码:
@PersistenceContext
protected EntityManager entityManager;
第一条指令工作正常,但第二条指令抛出org.hibernate.SessionException:会话关闭!有什么想法吗?
上下文:spring batch 3.0.6 / hibernate 3.5.0
信息:注入EntityManager:
if(isNewEm) {
EntityManagerFactoryUtils.closeEntityManager(target1);
}
更新1
我可以在find方法中看到对this.getSession()的调用,如果会话为null(在EntityManagerImpl.getRawSession中),则打开一个新会话
更新2
在第二种情况下,getSession方法不是调用,而是一个名为SharedEntityManagerCreator的关闭会话的类:
In[5]:df
Out[5]:
id col2 col3
0 1 2 5
1 1 2 2
2 2 8 3
3 2 3 6
4 2 3 1
5 1 3 7
6 2 5 6
7 1 8 6
答案 0 :(得分:1)
通过适当的JPA事务管理,底层的Hibernate Session
应该已经打开。如果您正在使用声明式事务管理(基础事务管理器应该知道JPA),请确保使用@Transactional
注释您的服务方法。如果您不使用声明式事务管理,可以调用
entityManager.getTransaction().begin();
完成后,请不要忘记关闭与commit()
或rollback()
的交易。