我正在努力理解我应该如何处理在Jboss EAP 7实例上运行的JTA和CDI。我可以通过注入来自容器的UserTransaction对象手动获取事务,但是当我使用@Transactional注释方法时,我得到一个关于没有可用事务的异常....我的问题是。有没有配置丢失?我简单地读到,也许我应该自己创建一个拦截器以使其工作,但我还没有找到任何一致的例子......
答案 0 :(得分:0)
在默认的JEE容器管理环境中,只有企业bean(通常使用@Stateless
bean)才是事务性的。从外部输入这样的bean后,将打开该事务。使用@javax.transaction.Transactional
注释,您可以控制事务的行为,但在默认情况下这不是必需的。
示例bean:
@Stateless
public MyBean {
public void withinTransaction() {
System.out.println("i'm running within a transaction");
}
@Transactional(TxType.NOT_SUPPORTED)
public void outsideTransaction() {
System.out.println("no transaction available...");
}
}
MyBean.withinTransaction
(例如通过REST),则会创建一个新事务(如果尚未存在)。MyBean.outsideTransaction
,则不会创建任何交易。this.outsideTransaction()
拨打withinTransaction
,您仍然可以在outsideTransaction
中使用该事务(因为拦截器只绑定到bean边界)this.withinTransaction()
调用outsideTransaction
,则不会创建新事务(因为拦截器仅绑定到bean边界)outsideTransaction
成为第二个bean AnotherBean
的一部分,@Inject
s MyBean
,并且您致电MyBean.withinTransaction
,那么新的交易将是创建(如果尚未存在)。因为您跨越了AnotherBean.outsideTransaction
和MyBean.withinTransaction
之间的bean边界。