2017-02-09 97 views
0

我努力理解我应该如何处理JTA和CDI上一个JBoss EAP 7实例中运行。我可以通过注入一个来自容器的UserTransaction对象来手动获得一个事务,但是当我用@Transactional注释该方法时,我得到一个关于没有可用事务的异常....我的问题是。有没有配置丢失?我简单地读了一下,也许我应该自己创建一个拦截器以使其工作,但我还没有找到任何一致的示例...的Jboss EAP 7 CDI JTA @Transactional

+0

我觉得自己没有足够的细节这个问题得到比如何建立与数据库连接的应用程序完全JEE教程更好的答案。这超出了StackOverflow范围。你可以缩小你的问题吗?比如你问“有没有配置丢失”,而没有提及你实际拥有的配置。或者粘贴任何可以告诉我们的代码,如果你正在做你说的正确的事情。 – Deltharis

+0

您是否做过任何会禁用自动交易的功能? –

+0

我们需要知道你在哪里放置@Transactional注释。请分享您的代码。你不需要任何拦截器,因为'@Transactional'已经是拦截器绑定了。 – Rouliboy

回答

0

在默认的JEE容器管理环境中,只有企业bean(通常为@Stateless beans被使用)是事务性的。一旦你从外面输入这样一个bean,交易将被打开。通过@javax.transaction.Transactional注释,您可以控制事务的行为,但在默认情况下这不是必需的。

例豆:

@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..."); 
    } 
} 
  • 如果调用从Servlet MyBean.withinTransaction(例如,经由REST),一个新的事务被创建(如果尚未存在)。
  • 如果您致电MyBean.outsideTransaction,则不会创建任何交易。
  • 如果你调用从withinTransactionthis.outsideTransaction(),你仍然有可交易的outsideTransaction(因为拦截器只绑定到bean边界)
  • 如果从outsideTransaction调用this.withinTransaction()没有新的交易产生(因为拦截器只有绑定到豆边界)
  • 如果outsideTransaction将是第二个bean AnotherBean,这@Inject小号MyBean的一部分,你叫MyBean.withinTransaction,然后一个新的事务将被创建(如果尚未存在)。因为你跨越了AnotherBean.outsideTransactionMyBean.withinTransaction之间的bean边界。