2011-11-17 70 views
5

通常,玩! commits the transaction after a request completes successfully。 在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

調試,我發現p有一個ID甚至在交易提交之前。我不知道如何。 – ripper234

+0

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

回答

5

您可以通過調用JPA.em()來獲得Hibernate EntityManager。然後,從那裏,您可以訪問事務(JPA.em()。getTransaction())。

如果您打算自己管理交易,您需要禁用Play!的交易處理(您可以在方法或控制器上使用@NoTransaction註釋來執行此操作)。否則,玩!無論如何都會在請求結束時嘗試提交事務,如果您已經自己完成了該操作,則會導致異常。

+0

我剛剛發現了這個......但是調用'commit()'似乎不會與Play!的事務處理產生任何衝突。該實體被添加到數據庫,並且我沒有收到錯誤頁面。 – ripper234

+0

調用'commit()'本身不會引起衝突,但是如果你試圖與DB進一步交互,你需要讓Play爲自己啓動另一個Transaction:'JPAPlugin.startTx(boolean readonly)'From在那裏,Play甚至不知道交易已經發生。 – Indigenuity

0

你不需要做任何事情。請求完成後沒有任何例外,交易將爲您承擔。

只需確保在事務結束時要保留的所有實體上保存即可。

+1

我想手動提交請求...我重新回答了這個問題,以更好地反映我的意圖。 – ripper234