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