没有手动提交的JTA EntityManager

时间:2013-04-20 23:53:30

标签: java entitymanager jta

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

现在,在关闭Seam Faces模块后,我停留在JTA交易上。有集成的交易管理。交易开始并自动提交 - 无需手动提交。

现在,当我尝试执行EntityManager.persist()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()有效。为什么呢?

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

1 个答案:

答案 0 :(得分:1)

好的,所以可以用拦截器制作CDI bean tansactional: - )

最后,我设法解决了阅读本文的问题:

http://smokeandice.blogspot.com/2009/12/cdi-and-declarative-transactions.html

修改

从JEE7开始,有一个新的@Transactional注释,它将CDI bean或方法中的所有JPA操作都转换为事务。