用于bean的CDI @TransactionAttribute

我正在测试应用程序上试验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会这样做,但我没有使用它。 实际上我把它添加到了项目中,但之后我删除了它,因为我收到了尴尬的exception。

任何人都可以清除我的困惑吗? 真的CDI为普通bean定义@TransactionAttribute吗?

PS我有另一种问题。 我看到趋势是将所有EJB注释移植到普通bean。 那么EJBs将来会变得过时吗? 我的意思是我在JIRA中看到将来会为普通bean添加@TransactionAttribute (任务仍未解决)。 那么,这种eclipsing EJB不是重复的function吗?

最好的问候,Petar

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