を使用してトランザクションを再開することはできません:iが1 EntityManagerを使用して二回のトランザクションをオープンしようとしているEntityManger
EntityManagerFactory emf = Persistence.createEntityManagerFactory("HelloWorldPU");
EntityManager em = emf.createEntityManager();
Message message0 = new Message();
message0.setText("Hi!!");
em.getTransaction().begin();
em.persist(message0);
em.getTransaction().commit();
em.close();
Message message1 = new Message();
message1.setText("Bye!!");
System.out.println("i'm here");
em.getTransaction().begin();
em.persist(message1);
em.getTransaction().commit();
em.close();
と例外を取得:
を私は「ここ
スレッドでの例外ですメイン "java.lang.IllegalStateException:or[email protected]31e4bb20が閉じている
私の推測です:閉鎖されたEntityManagerから別のトランザクションを取得することはできません。しかしJPA Specは言う:
EntityManager.close
方法は、その永続コンテキストや他のリソースを解放するために、エンティティ・マネージャを閉じます。close
を呼び出した後、アプリケーションはgetTransaction
とisOpen
以外のインスタンスでそれ以上のメソッドを呼び出さないでください。そうでないとIllegalStateException
がスローされます。トランザクションがアクティブなときにclose
メソッドが呼び出されると、トランザクションが完了するまで持続コンテキストが管理されたままになります。
誰かが私が間違っていると説明できますか? getTransaction
を呼び出す可能性はありません、私はこのトランザクションを使用することができ、トランザクションのメソッドを呼び出すことができますか?
ありがとうございます。答えを
UPDATE
おかげで、これらは私のために最も有用である:
1:
あなたが近くに呼び出すまで、あなたはEntityManagerを使用することができます、はい。 「再オープン」メソッドはありません。 EntityManagerを作成する安価な操作である - ニール ストックトン13分前
2:あなたは、トランザクションがアクティブであるかどうかを確認するためにgetTransactionを呼び出すことができます
。 Yu は、アクティブなtx(ドキュメント 状態)と終了後にコミットするEntityManagerを閉じることもできます。したがって、あなたは getTransactionと呼ぶことができます。 - M. Deinum 9分前
ドキュメントはかなり明確です.... *アプリケーションは、* ...あなたがいない、閉じたエンティティマネージャで何かを保持しようとしている、getTransactionといるisOpen以外のEntityManagerインスタンス上の任意の更なるメソッドを呼び出す必要がありません許可されます。エンティティマネージャで一度だけcloseを呼び出す必要があります。その後、私はgetTransactionを呼び出すことができますし、それを使用することはできませんなぜ –
OK、しかし、私は理解できないことはありますか? –
なぜEntityManagerを終了してANYメソッドを呼び出そうとしますか?後でそれをもう一度閉じようとするのはもちろんです。 –