java - Bean 的 CDI @TransactionAttribute

标签 java transactions java-ee-6 cdi

我正在测试应用程序中试验 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/

相关文章:

c# - 事务应该处于 WCF 服务级别还是数据库访问级别?

java - 使用 EJBContext getContextData - 这安全吗?

java - 有没有办法在没有 EAR 的情况下将 EJB 模块与 WAR 打包在一起?

jakarta-ee - 您如何部署 Web 应用程序?

java - 如何在果冻中实现无选择 <f :select/>?

java - 通过 memcache 集成的 spring mvc 中的这个错误是什么

java - 如何使用 Java 8 Stream 从某些类属性中获取列表?

javascript - 处理数据库事务返回

java - 使用递归将 int 转换为十六进制字符串

sql-server - SQL服务器事务