从JNDI查找获得的EntityManager已经关闭

时间:2012-11-08 04:07:11

标签: java hibernate jpa java-ee-5 glassfish-2.x

For(Glassfish v2.1),来自会话bean的两个单独请求中的两个RuntimeExceptions:

  • “org.hibernate.SessionException:会话已关闭!”
  

org.hibernate.SessionException:会话已关闭!       at 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)    [wrapped] javax.persistence.PersistenceException:org.hibernate.SessionException:会话已关闭!       在org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:614)       在org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:76)

  • “java.lang.IllegalStateException:EntityManager已关闭”
  

java.lang.IllegalStateException:EntityManager已关闭       在org.hibernate.ejb.EntityManagerImpl.close(EntityManagerImpl.java:97)       at com.sun.enterprise.util.QueryWrapper.clearDelegates(QueryWrapper.java:460)       在com.sun.enterprise.util.QueryWrapper.getResultList(QueryWrapper.java:198)

这两个EntityManagers都是通过JNDI查找获得的(java:comp:/ env / TargetSitePersistenceContext) 使用JTA(事务类型属性未在persistence.xml中定义)。 &安培; SQL Server 2008 w / sqljdbc4.jar

代码只执行ff:

query = entityManager.createQuery();
query.getResultList();

就是这样。如果我没有弄错,我相信app容器将处理open / commit / rollback / close,所以我们不应该有任何entityManager.close()。

可能导致这两个运行时异常的原因是什么?

GF何时实际打开/关闭EntityManager?

之间有什么区别:

  • 通过JNDI查找获得的EntityManager
  • 通过@PersistenceContext注入? (到目前为止还没有这种风格的问题)

2 个答案:

答案 0 :(得分:0)

在所有条件相同的情况下,@ PersistenceContext注入和JNDI查找应该返回相同的EntityManager。所以它可能是GlassFish的一个错误,你可能想要达到它们。但是请确保提供所有上下文,例如用于注入,事务或非等的会话bean类型等。

答案 1 :(得分:0)

使用注释@TransactionAttribute

标记您的bean
@Stateless
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public class Repo implements IRepo
{  

容器管理的事务由此参数

管理