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
清理构建。现在它抛出了一个事务所需的异常。谢谢你的帮助:)