我正在测试应用程序上试验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是不是有点复制功能呢?
祝你好运, 斯托
答案 0 :(得分:3)
您需要定义一个事务拦截器。基本上定义@Transactional注释并拦截用它注释的所有方法。在拦截器中刚刚开始,提交或回滚事务。当事务传播进入图片时,它变得更加复杂。因此,请检查Seam是否没有任何可以使用的http://seamframework.org/Seam3/PersistenceModule