我想我的項目從煤層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()
工作。爲什麼?
它們不應該一直工作 - 應用程序管理和容器管理?
使用EJB。他們以聲明的方式處理交易。 – 2013-04-21 07:20:47
謝謝JB Nizet,你是對的。但我仍然不明白。 – robson 2013-04-22 10:02:33
好吧,我更新了我的問題(並刪除了答案 - 你是對的) – robson 2013-04-22 12:52:59