用于bean的CDI @TransactionAttribute

时间:2011-08-02 06:40:45

标签: java transactions java-ee-6 cdi

我正在测试应用程序上试验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。作为测试,我使用finishGame()注释注释@TransactionAttribute并且它有效(控制器bean不是EJB)。所以我的问题是:它是如何工作的? CDI是否为普通bean定义@TransactionAttribute?我知道Seam Persistence Module这样做,但我没有使用它。实际上我把它添加到了项目中,但之后我删除了它,因为我收到了尴尬的例外。

有人能清除我的困惑吗?真的CDI为普通豆定义@TransactionAttribute吗?

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

祝你好运, 斯托

1 个答案:

答案 0 :(得分:3)

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