对于(Glassfish v2.1),来自会话 bean 的两个单独请求的两个 RuntimeExceptions:
- “org.hibernate.SessionException:会话已关闭!”
org.hibernate.SessionException:会话已关闭!在 org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:72) 在 org.hibernate.impl.SessionImpl.list(SessionImpl.java:1138) 在 org.hibernate.impl.QueryImpl.list(QueryImpl.java:102 ) 在 org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:67) [包装] javax.persistence.PersistenceException: org.hibernate.SessionException: 会话已关闭!在 org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:76) 的 org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:614)
- “java.lang.IllegalStateException:EntityManager 已关闭”
java.lang.IllegalStateException:EntityManager 在 com.sun.enterprise.util.QueryWrapper.clearDelegates(QueryWrapper.java:460) 在 com.sun 的 org.hibernate.ejb.EntityManagerImpl.close(EntityManagerImpl.java:97) 处关闭。 enterprise.util.QueryWrapper.getResultList(QueryWrapper.java:198)
这两个 EntityManager 都是通过使用 JTA 的 JNDI 查找 (java:comp:/env/TargetSitePersistenceContext) 获得的(persistence.xml 中未定义事务类型属性)。& SQL Server 2008 w/ sqljdbc4.jar
代码只是做ff:
query = entityManager.createQuery();
query.getResultList();
就是这样。如果我没记错的话,我相信应用程序容器会处理打开/提交/回滚/关闭,所以我们不应该有任何 entityManager.close()。
什么可能导致这两个运行时异常?
GF 何时实际打开/关闭 EntityManager?
有什么区别:
- 通过 JNDI 查找获得的 EntityManager
- 通过@PersistenceContext 注入?(到目前为止,这种风格没有问题)