【问题标题】:JTA EntityManager without manual commits没有手动提交的 JTA EntityManager
【发布时间】:2013-04-20 23:53:29
【问题描述】:

我正在尝试将我的项目从 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() 起作用。为什么?

它们不应该始终同时工作吗 - 作为应用程序管理和容器管理?

【问题讨论】:

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

标签: java entitymanager jta


【解决方案1】:

好的,因此可以使 CDI bean 具有交互性 - 使用拦截器 :-)

我终于设法解决了阅读这篇文章的问题:

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

编辑:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-30
    • 2012-05-24
    • 2012-06-13
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    相关资源
    最近更新 更多