gpt4 book ai didi

java - Bean 的 CDI @TransactionAttribute

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:00:58 28 4
gpt4 key购买 nike

我正在测试应用程序中试验 CDI。我有一个 DAO,它注入(inject)一个容器管理的 JTA 持久性上下文,如下所示:

public class TestDAO implements Serializable {
@PersistenceContext
private EntityManager entityManager;

public void insertEntity(Test test) {
entityManager.persist(test);
}
}

现在我有一个像这样的 CDI Controller bean:

@Named
@SessionScoped
public class TestController implements Serializable {
@Inject
private TestDAO testDAO;

public void finishGame() {
testDAO.insertEntity(new Test(1, 2, 3));
}
}

如果我运行它,我在尝试插入实体时在 DAO 中收到错误,因为没有可用的 Activity 事务。到目前为止,一切都很好。我可以通过使 Controller bean 成为有状态的 EJB 来解决这个问题,它将 finishGame() 包装在事务中。

但假设我不需要 EJB。作为测试,我用 @TransactionAttribute 注释对 finishGame() 进行了注释,它起作用了( Controller bean 不是 EJB)。所以我的问题是:它是如何工作的? CDI 是否为普通 bean 定义了 @TransactionAttribute?我知道 Seam Persistence Module 可以执行此操作,但我没有使用它。实际上我将它添加到项目中,但之后我删除了它,因为我收到了尴尬的异常。

谁能解开我的困惑? CDI 真的为普通 bean 定义了 @TransactionAttribute 吗?

附言我有另一种问题。我看到趋势是将所有 EJB 注释移植到普通 bean。那么 EJB 将来会过时吗?我的意思是我在 JIRA 中看到 @TransactionAttribute 将在未来为普通 bean 添加(任务仍未解决)。那么,这不是 EJB 的黯然失色,某种复制功能吗?

最好的问候,佩塔尔

最佳答案

您需要定义一个事务拦截器。基本上定义一个@Transactional 注释并拦截所有用它注释的方法。在拦截器中刚刚开始、提交或回滚事务。当事务传播出现时,它会变得更加复杂。所以检查一下 Seam 是否没有任何现成的东西 http://seamframework.org/Seam3/PersistenceModule

关于java - Bean 的 CDI @TransactionAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6908191/

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