0

(Glassfish v2.1)の場合、セッションBeanからの2つの別々のリクエストからの2つのRuntimeExceptions:

  • "org.hibernate.SessionException:セッションが閉じられました!"

org.hibernate.SessionException:セッションが閉じられました!at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:72)at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1138)at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102 )at 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は、com.sunのcom.sun.enterprise.util.QueryWrapper.clearDelegates(QueryWrapper.java:460)のorg.hibernate.ejb.EntityManagerImpl.close(EntityManagerImpl.java:97)で閉じられます。 Enterprise.util.QueryWrapper.getResultList(QueryWrapper.java:198)

これらのEntityManagerは両方とも、JTAを使用したJNDIルックアップ(java:comp:/ env / TargetSitePersistenceContext)を介して取得されました(transaction-type属性はpersistence.xmlで定義されていません)。&SQL Server 2008 w / sqljdbc4.jar

コードはffを実行します:

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

以上です。私が間違っていなければ、アプリコンテナはopen / commit / rollback / closeを処理すると思います。したがって、entityManager.close()は必要ありません。

これらの2つのランタイム例外の原因は何でしょうか。

GFはいつEntityManagerを実際に開閉しますか?

間に違いはありますか?

  • JNDIルックアップを介して取得されたEntityManager
  • @PersistenceContextインジェクションを介して?(これまでのところ、このスタイルの問題はありません)
4

2 に答える 2

0

Bean にアノテーションを付ける@TransactionAttribute

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

コンテナ管理トランザクションはこのパラメータによって規制されます

于 2012-11-08T10:56:44.643 に答える
0

すべてが等しい場合、@PersistenceContext インジェクションと JNDI ルックアップは同じ EntityManager を返す必要があります。それは GlassFish のバグかもしれません。ただし、インジェクションに使用されるセッション Bean のタイプ、トランザクションの有無など、すべてのコンテキストを必ず提供してください。

于 2012-11-08T07:51:35.850 に答える