2013-11-02 92 views
6

我想在另一個持久化上下文中管理一個非託管實體。我讀這可以合併進行:jpa合併非託管實體

em.merge(user); 

但如果我這樣做是不添加到上下文:

boolean isManaged = em.contains(user); 

永遠是假的。

即使我做了以下內容:

User dbuser = em.find(User.class, user.getId()); 
em.merge(user); 
boolean isManaged = em.contains(user); 

的DBUSER和用戶是完全一樣的。

我在做什麼錯?

我使用JPA,MySQL數據庫時,JBoss EAP 6.1

+3

你是否開始並提交交易?此外,請執行以下操作:'dbuser = em.merge(user);' – Sam

+0

我可以使用JPA啓動事務嗎(沒有Spring等或本地Hibernate)?我只需使用@TransactionManagement(TransactionManagementType.CONTAINER) – Dave

+0

可以通過'em.getTransaction()'調用'.begin()''''.commit()'''.rollback()'來獲取事務對象。但是,在配置中可能不需要甚至不可能(在使用JTA EntityManager時)。 – Sam

回答

0

呼叫entityManager.flush()提交您的合併操作到數據庫中。

通常情況下,提交延遲。例如,如果你的方法有一個@TransactionAttribute註釋。該方法完成後,交易將被提交。但是如果你沒有提交就打電話給em.contains(user),你只會得到舊狀態。