用于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