Java 无需手动提交的JTA EntityManager

Java 无需手动提交的JTA EntityManager,java,entitymanager,jta,Java,Entitymanager,Jta,我正试图从Seam 3中移出我的项目 现在,在关闭Seam Faces模块后,我被JTA事务卡住了。有综合事务管理。事务自动开始并提交,无需手动提交 现在,当我尝试执行EntityManager.persist()或EntityManager.merge(对象实体)时,出现了错误: JBAS011469: Transaction is required to perform this operation (either use a transaction or extended persiste

我正试图从Seam 3中移出我的项目

现在,在关闭Seam Faces模块后,我被JTA事务卡住了。有综合事务管理。事务自动开始并提交,无需手动提交

现在,当我尝试执行
EntityManager.persist()
EntityManager.merge(对象实体)
时,出现了错误:

JBAS011469: Transaction is required to perform this operation (either use a transaction or extended persistence context)
有没有办法强制JTA启动事务并透明地提交它?

还有一件有趣的事——不久前,我在寻找如何在Seam3中强制手动提交/回滚的解决方案

好的,若我将bean置于@Stateless状态,那个么它的行为和我预期的一样

但是

如果我使用应用程序管理的EntityManager,那么我应该自己管理事务(下面的示例中的方法
testApplicationJTA()
),但如果我使用容器管理的EntityManager,那么它应该在没有事务管理的情况下工作(方法
TestContainertJTA()

我的例子是:

@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()
起作用。为什么?


它们是否应该始终都工作?作为应用程序管理和容器管理?

好的,因此可以使用拦截器使CDIBean tansactional:-)

通过阅读本文,我终于解决了我的问题:

编辑:


JEE7中有一个新的
@Transactional
注释,它将CDIBean或方法中的所有JPA操作都纳入事务中。

使用EJB。他们以声明的方式处理事务。谢谢,你说得对。但我还是不明白。好吧,我更新了我的问题(并删除了答案-你是对的)