【发布时间】: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