我正在尝试将我的项目从 Seam 3 中移出。
现在我在关闭 Seam Faces 模块后卡在 JTA 事务上。有综合交易管理。事务已开始并自动提交 - 无需手动提交。
现在,当我尝试执行EntityManager.persist()
or时EntityManager.merge(Object entity)
,出现错误:
JBAS011469: Transaction is required to perform this operation (either use a transaction or extended persistence context)
有什么方法可以强制 JTA 启动事务并透明地提交它?
附言。有趣的事情 - 前段时间我正在寻找如何在 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()
有效。为什么?
它们不应该一直工作吗——作为应用程序管理和容器管理?