2012-06-20 43 views
0

我試圖堅持一個簡單的實體,但它不會持續到數據庫沒有任何錯誤。我正在使用glassfish 3.1.2,hibernate 4.1.3.Final,事務範圍/容器管理的entitymanager。 jta事務在persistence.xml中配置,jta datasource設置正確。它是一個具有默認事務級別(必需)的無狀態會話Bean。在控制檯中,我從Hibernate的TransactionCoordinatorImp幾次看到「由於自動連接檢查而跳過JTA同步註冊」消息。我可以使用entitymanager.find找到手動插入的實體。但不能堅持或合併。任何想法可能是什麼問題?由於自動加入檢查而跳過JTA同步註冊

更新:看起來問題與「由於自動連接檢查而跳過JTA同步註冊」消息無關。如果我將事務隔離級別設置爲REQUIRES_NEW,則添加新實體,但如果將隔離級別設置爲REQUIRED,則不會持久化。該方法是第一個接收jax-rs Web服務調用的方法。爲什麼我需要REQUIRES_NEW隔離級別?

回答

2

你沒有給出足夠的關於你的設置的細節,所以我只能回答一般。

跳過同步註冊位實際上確實發揮了這一點。這是JPA稱爲交易加入的一部分。基本原則是EntityManager不允許(按規格)自動參與在創建時不活躍的交易。在僞代碼中,其之間的差值:

// start transaction 
// create EntityManager 
// use EntityManager 
// commit transaction 

和:

// create EntityManager 
// start transaction 
// use EntityManager 
// commit transaction 

在第一種情況中,EntiytManager被活動事務的範圍內創建的,因此它會自動聯接。在第二種情況下,它是在活動事務的範圍之外創建的,因此它不能自動加入。

在這種情況下EntityManager.joinTransaction()必須調用具有了EntityManager參與該事務:

// create EntityManager 
// start transaction 
entityManager.joinTransaction(); 
// use EntityManager 
// commit transaction 

這是你發現自己的情況你只需要找出如何/爲什麼如果這不符合您的期望,EntityManager將在事務範圍之外被創建。

+1

雖然我只使用J2EE無狀態bean和@PersistenceContext註釋來注入EM,seam-persistence-3.1.0和seam-transaction-3.1.0 jars導致上述問題。我已經將它們從類路徑中移除,並且消息已經消失。我認爲seam-transaction和hibernate存在兼容性問題。 – Deniz