Java bean的CDI@TransactionAttribute

Java bean的CDI@TransactionAttribute,java,transactions,java-ee-6,cdi,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
。我有一个
DAO
,它注入了一个容器管理的
JTA
持久性上下文,如下所示:

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

    public void insertEntity(Test test) {
        entityManager.persist(test);
    }
}
@Named
@SessionScoped
public class TestController implements Serializable {
    @Inject
    private TestDAO testDAO;

    public void finishGame() {
        testDAO.insertEntity(new Test(1, 2, 3));
    }
}
现在我有了一个CDI控制器bean,如下所示:

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

    public void insertEntity(Test test) {
        entityManager.persist(test);
    }
}
@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持久性模块
可以做到这一点,但我没有使用它。事实上,我把它添加到了项目中,但后来我删除了它,因为我收到了令人尴尬的异常

有人能消除我的困惑吗?是否真的为普通bean定义了
@TransactionAttribute

另外,我还有一个问题。我看到的趋势是将所有
EJB
注释移植到普通bean。那么,
ejb
将来会过时吗?我的意思是,我在《代码》中看到,未来将为普通bean添加
@TransactionAttribute
(任务仍未解决)。那么,这不是让EJB黯然失色的一种复制功能吗

致以最良好的祝愿,
Petar

您需要定义一个事务拦截器。基本上定义一个@Transactional注释并截取所有用它注释的方法。在拦截器中,只需开始、提交或回滚事务。当事务传播进入图片时,它变得更加复杂。因此,请检查Seam是否有任何可用的工具,谢谢您提供的有用答案!但我的问题是为什么
@TransactionAttribute
在一个普通的
CDI
bean上工作,而什么都不做?我一直认为,
@TransactionAttribute
只适用于
ejb
。是的,我认为是这样的-@TransactionAttribute不应该开箱即用是的,这很奇怪。当您有足够的时间时,您是否可以制作一个简单的
CDI
应用程序,并尝试
@TransactionAttribute
是否可以在普通的
CDI
bean上工作。这让我抓狂,因为我知道它不应该在普通bean上工作……我还将从头开始制作一个示例应用程序,以确认我是否遗漏了某些内容,这是最有可能的情况:)事实就是如此
Glassfish
缓存了库和描述符,尽管我告诉
NetBeans
清理构建。现在它抛出了一个事务所需的异常。谢谢你的帮助:)