在EJB

2013-04-18 32 views
0

與交易類型的工作,我有以下例子:在EJB

public class MyEJBService implements javax.ejb.SessionBean { 
     public void modifyAllItems() { 
      doSomething... 
      for(...) 
      { 
       modifyItem(item); 
      } 
     } 


    public void modifyItem(Item item) { 
      doSomething... 
    } 
} 

方法1 = modifyAllItems 方法2 = modifyItem

方法1調用方法2數次。我想在method1上禁用事務,但在method2上啓用事務。 method2的每次調用都應該在不同的事務中(如果在修改項目時發生錯誤,某些項目可能已被修改,而其他項目則保持不變)。我爲method1()定義了一個EJB事務類型 - 從不爲另一個method2() - 需要新的。問題在於,當我調用method2()時,EJB並沒有創建任何事務,因爲當method2()內發生錯誤時,它不會回滾(如果method2內的數據庫發生了某些更改,但它會拋出在method2完成之前的一個異常數據庫沒有返回到以前的狀態 - 回滾)。預期這種行爲?我有點困惑。非常感謝你。

回答

2

是的,這是預期的行爲,因爲事務是使用代理實現的,所以只有在從第三方對象調用EJB方法時才應用。如果您希望method2()事務在從method1()調用時應用,則必須將其移至第二個EJB對象。

+0

謝謝!現在設想我從這個EJB對象的外部調用modifyAllItems(),並且modifyAllItems()和modifyItem()都使用默認的EJB事務類型Required。客戶端沒有運行任何事務,因此當調用modifyAllItems()時將啓動新的事務。爲什麼在從modifyAllItems()中調用modifyItem()時,EJB決定使用相同的事務?我的意思是,如果在同一個EJB對象內的另一個服務中調用服務,EJB事務類型配置是否很重要? –

+1

不,它僅適用於從外部調用 – Gab

1

另一個想法是Bean管理事務,belowing是步驟

  1. ejb-jar.xml中

    <交易類型>豆< /交易類型>

  2. 代碼

    public class MyEJBService implements javax.ejb.SessionBean {
    SessionContext上下文;

    public void modifyAllItems() 
    { 
        doSomething(); 
        for(...) 
        { 
         UserTransaction trans=context.getUserTransaction();; 
         try 
         { 
          trans.begin(); 
          modifyItem(item); 
          trans.commit(); 
         }catch(Exception e) 
         { 
          trans.rollback();//if need propagation then:trans.setRollbackOnly(); 
         } 
        } 
    } 
    
    public void modifyItem(Item item) { 
        doSomething(); 
    } 
    
    @Override 
    public void setSessionContext(SessionContext context) throws EJBException, 
         RemoteException { 
        this.context = context; 
    } 
    
+0

也可以在EJB3規範中使用@TransactionManagement(TransactionManagementType.BEAN)註釋。 –