0

对于(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 注入?(到目前为止,这种风格没有问题)
4

2 回答 2

0

在所有条件相同的情况下,@PersistenceContext 注入和 JNDI 查找应该返回相同的 EntityManager。因此,这可能是 GlassFish 的一个错误,您可能想要接触它们。但请确保提供所有上下文,例如用于注入的会话 bean 类型、事务与否等。

于 2012-11-08T07:51:35.850 回答
0

用注解标记你的 bean@TransactionAttribute

@Stateless
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public class Repo implements IRepo
{  

容器管理事务受此参数调节

于 2012-11-08T10:56:44.643 回答