gpt4 book ai didi

java - 无需手动提交的 JTA EntityManager

转载 作者:行者123 更新时间:2023-12-01 14:39:29 26 4
gpt4 key购买 nike

我正在尝试将我的项目从 Seam 3 中移出。

现在,在关闭 Seam Faces 模块后,我陷入了 JTA 事务的困境。有集成的交易管理。事务已开始并自动提交 - 无需手动提交。

现在,当我尝试执行 EntityManager.persist()EntityManager.merge(ObjectEntity) 时,出现错误:

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 () 有效。为什么?

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

最佳答案

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

最后我成功解决了阅读这篇文章的问题:

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

编辑:

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

关于java - 无需手动提交的 JTA EntityManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16126486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com