For(Glassfish v2.1),来自会话bean的两个单独请求中的两个RuntimeExceptions:
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已关闭 在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?
之间有什么区别:
答案 0 :(得分:0)
在所有条件相同的情况下,@ PersistenceContext注入和JNDI查找应该返回相同的EntityManager。所以它可能是GlassFish的一个错误,你可能想要达到它们。但是请确保提供所有上下文,例如用于注入,事务或非等的会话bean类型等。
答案 1 :(得分:0)
使用注释@TransactionAttribute
@Stateless
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public class Repo implements IRepo
{
容器管理的事务由此参数
管理