2013-06-28 119 views
2

我使用REQUIRE_NEW註釋了一個方法,我期望它在新事務中執行。以下是代碼:EJB事務REQUIRE_NEW

public class EJBAImpl implements EJBA { 
    @EJB 
    private EJBB ejbb; 

    public void someMethod(entity){ 
     ejbb.create(entity); 
     //doMoreStuff 
    } 
} 

public class BaseEJB { 
    public void create(Entity entity) { 
     //saveHere 
    } 
} 

public class EJBBImpl extends BaseEJB implements EJBB { 
    @Override 
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public void create(Entity entity) { 
     super.create(entity); 
    } 
} 

Howerver,當我把一個斷點在該行的創建方法調用後(其中doMoreStuff說)我的實體不會被保存在數據庫中。我錯過了什麼?我查了一下,EJBB是一個代理。

編輯:想通了,如果該方法是繼承,它不起作用。解決的辦法是改變EJBB的方法,如下:

public class EJBBImpl extends BaseEJB implements EJBB { 

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public void anotherNameForCreate(Entity entity) { 
     super.create(entity); 
    } 
} 

有誰知道爲什麼它時,覆蓋從另一個類的方法不起作用?

回答

3

@TransactionAttribute具有特殊規則,如ejb3.1規範在13.3.7.1節中所述。

如果bean類有超類,則應用以下附加規則。

1)上的超類S]指定的事務屬性適用於如果在S沒有指定的類級事務屬性 由S.定義的 業務方法,它相當於 TransactionAttribute的規範(REQUIRED )上S.

2)事務屬性可以對由S類中定義的業務方法M. 指定來覆蓋方法M中的事務屬性 值的類顯式或隱式指定S.

3)如果應用到類S.

類S的方法M.覆蓋由S的超類 M的事務屬性由 上述規則確定所定義的商業方法根據我你understandig在第三點,因此,對於ejb容器,實際的事務屬性是REQUIRES_NEW的@REQUIERED。

0

點要考慮RequiresNew註釋

  1. 容器必須調用企業Bean的方法,其事務屬性設置爲RequiresNew一個新的事務上下文。

  2. 如果客戶端在客戶端未與事務上下文關聯時調用企業Bean方法,那麼容器AUTOMATICALLY在將方法調用委派給企業Bean業務方法之前啓動新事務。容器會自動將業務方法訪問的所有資源管理器與事務進行對照。

  3. 如果業務方法調用其他企業bean,Container將通過調用傳遞事務上下文。容器嘗試在業務方法完成時提交該事務。在方法結果發送給客戶端之前,容器執行提交協議。

  4. 如果客戶端使用事務上下文進行調用,則容器在啓動新事務並調用業務方法之前暫停事務上下文與當前線程的關聯。在業務方法和新交易完成後,容器恢復暫停的交易關聯。

解決方案

調用從另一個bean的EJB參考方法時,新交易將只創建。在同一個bean中調用create不會產生新的事務,所以你必須從另一個bean調用它。