我正在一个测试应用程序上试验CDI。我有一个注入容器管理的JTA持久化上下文的DAO,如下所示:
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成为一个将finishGame()包装在事务中的有状态EJB来解决这个问题。
但是让我们假设我不想要EJB。作为一个测试,我用@TransactionAttribute注释对finishGame()进行了注释,它可以工作(控制器bean不是EJB)。所以我的问题是:它是如何工作的?CDI是否为普通bean定义了@TransactionAttribute?我知道Seam Persistence Module可以做到这一点,但我不会使用它。实际上我把它添加到了项目中,但后来我把它删除了,因为我收到了令人尴尬的异常。
有没有人能澄清我的困惑?CDI真的为普通bean定义了@TransactionAttribute吗?
另外,我还有另外一种问题。我看到的趋势是将所有EJB注释移植到普通beans。那么EJBs在未来会被淘汰吗?我的意思是,我在JIRA中看到,未来将为普通beans添加@TransactionAttribute (任务仍未解决)。那么,这难道不是一种重复的功能吗?
致以最好的问候,Petar
发布于 2011-08-03 18:29:52
你需要定义一个事务拦截器。基本上就是定义一个@Transactional注解,并截获用它注解的所有方法。在拦截器中,只需开始、提交或回滚事务。当事务传播出现在画面中时,它变得更加复杂。因此,请检查Seam是否没有任何现成的http://seamframework.org/Seam3/PersistenceModule
https://stackoverflow.com/questions/6908191
复制相似问题