2013-04-20 35 views
0

我想我的項目從煤層3.JTA EntityManager的,無需人工承諾

搬出現在我卡在JTA事務關閉後縫面臨模塊。有整合的交易管理。事務開始並自動提交 - 無需手動提交。

現在,當我嘗試執行EntityManager.persist()EntityManager.merge(Object entity),我有錯誤:

JBAS011469: Transaction is required to perform this operation (either use a transaction or extended persistence context) 

有沒有辦法迫使JTA開始交易和透明承諾呢?

Ps。有趣的是 - 前一段時間我一直在尋找解決方案,如何在Seam3中強制手動提交/回滾。

好的,如果我把bean置於@Stateless狀態 - 那麼它的行爲就像我期望的那樣。

但是......

是不是 - 如果我把應用託管的EntityManager - 那麼我應該(例如下面的方法testApplicationJTA())我自己管理的事務,但如果我用容器管理的EntityManager - 那麼它應該在沒有事務管理的情況下工作(方法testContainterJTA())?

我的例子:

@Named 
@SessionScoped 
public class Test implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @PersistenceContext 
    private EntityManager   em; 

    @PersistenceUnit 
    private EntityManagerFactory emf; 

    @Resource 
    private UserTransaction   utx; 

    public void testContainerJTA() { 
     TestEntity entity = em.find(TestEntity.class, 1L); 
     entity.setName("dddddd"); 
     em.merge(entity); 

    } 

    public void testApplicationJTA() { 
     EntityManager mgr = emf.createEntityManager(); 
     TestEntity entity = em.find(TestEntity.class, 1L); 
     entity.setName("fffff"); 
     try { 
      utx.begin(); 
      mgr.joinTransaction(); 
      mgr.merge(dict); 
      utx.commit(); 
     } catch (Exception e) { 
      utx.rollback(); 
     } 

     mgr.close(); 

    } 
} 

在我的例子上述方法testContainerJTA()不工作。爲什麼?

如果我將刪除@SessionScoped並將@Stateless然後方法testApplicationJTA()不起作用,但testContainerJTA()工作。爲什麼?

它們不應該一直工作 - 應用程序管理和容器管理?

+1

使用EJB。他們以聲明的方式處理交易。 – 2013-04-21 07:20:47

+0

謝謝JB Nizet,你是​​對的。但我仍然不明白。 – robson 2013-04-22 10:02:33

+0

好吧,我更新了我的問題(並刪除了答案 - 你是對的) – robson 2013-04-22 12:52:59

回答