【问题标题】:CDI @TransactionAttribute for beanbean 的 CDI @TransactionAttribute
【发布时间】:2011-08-02 06:40:44
【问题描述】:

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

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

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

现在我有一个像这样的 CDI 控制器 bean:

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

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

如果我运行它,我会在尝试插入实体时在DAO 中收到错误消息,因为没有可用的活动事务。到现在为止还挺好。我可以通过使控制器 bean 成为有状态的 EJB 来解决这个问题,它将 finishGame() 包装在事务中。

但假设我不想要EJB。作为测试,我用@TransactionAttribute 注释注释了finishGame(),它起作用了(控制器bean 不是EJB)。所以我的问题是:它是如何工作的? CDI 是否为普通 bean 定义 @TransactionAttribute?我知道Seam Persistence Module 会这样做,但我没有使用它。其实我是把它加到项目里的,但后来又把它删掉了,因为我收到了尴尬的异常。

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

附:我还有一个问题。我看到趋势是将所有 EJB 注释移植到普通 bean。那么EJBs 将来会被淘汰吗?我的意思是我在JIRA 中看到@TransactionAttribute 将来会为普通bean 添加(任务仍未解决)。那么,这难道不是让 EJB 黯然失色吗?是一种复制功能吗?

最好的问候, 佩塔尔

【问题讨论】:

    标签: java transactions java-ee-6 cdi


    【解决方案1】:

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

    【讨论】:

    • +1,感谢您的有用回答!但我的问题是,为什么@TransactionAttribute 在一个普通的CDI bean 上工作,而不做任何事情?我一直认为@TransactionAttribute 只适用于EJBs
    • 是的,我认为是这样 - @TransactionAttribute 不应该开箱即用
    • 是的,这很奇怪。当你有足够的时间时,你能不能做一个简单的CDI 应用程序并尝试@TransactionAttribute 是否适用于普通的CDI bean。它让我发疯,因为我知道它不应该在普通豆子上工作......
    • 我还将从头开始再次制作一个示例应用程序,以确认我是否遗漏了什么,这是最可能的情况:)
    • 就是这样。 Glassfish 已经缓存了库和描述符,尽管我告诉 NetBeans 清理构建。现在它应该抛出一个事务所需的异常。感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 2015-04-20
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 2023-03-10
    相关资源
    最近更新 更多