2011-11-17 4 views
5

通常、Play! commits the transaction after a request completes successfully。 Playで手動でトランザクションをコミットする正しい方法は何ですか?Playをコミットするにはどうすればいいですか? JPAトランザクションは手動でですか?

void addPerson() { 
    Person p = new Person("John", "Doe"); 
    p.save(); 

    // TODO - commit the transaction 

    // Now p should have an ID 
    assert p.id != null; 
    usePersonIdForSomethingNasty(p.id); 
} 
+0

Debuggin、トランザクションがコミットされる前でもpにIDがあることがわかりました。どのように思う? – ripper234

+0

http://stackoverflow.com/questions/8169640/how-does-anentity-get-an-id-before-a-transaction-is-committed-in-jpa-play – ripper234

答えて

5

JPA.em()を呼び出してHibernate EntityManagerを取得できます。そこから、トランザクション(JPA.em()。getTransaction())にアクセスできます。

自分でトランザクションを管理する場合は、Play!のトランザクション処理を無効にします(メソッドまたはコントローラで使用できる@NoTransactionアノテーションがあります)。それ以外の場合は、Play!とにかくリクエストの最後にトランザクションをコミットしようとしますが、既にそれを行っている場合は例外が発生します。

+0

私は自分自身でこれを見つけました...しかし、 'commit()'を呼び出すと、Play!のトランザクション処理と競合していないようです。エンティティがDBに追加され、エラーページが表示されません。 – ripper234

+0

'commit()'を呼び出すとそれ自体で競合が発生することはありませんが、DBとのやりとりをさらに試行する場合は、別のトランザクションを開始する必要があります: 'JPAPlugin.startTx(boolean readonly)'そこでは、Playはすでにトランザクションが発生したことを知ることさえできません。 – Indigenuity

0

何もする必要はありません。リクエストが何も例外なく終了した後、トランザクションはあなたのためにコミットされます。

トランザクションの終了時に保持するすべてのエンティティで「保存」を呼び出すようにしてください。

+1

私は手動でリクエストをコミットしたい...私は、私の意図をよりよく反映するように質問を改めました。 – ripper234

関連する問題