2017-02-09 138 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邊界。