2013-04-22 197 views
1

我有3層的EJB:處理JPA交易異常

第一種是持久性:

@Stateless 
@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public class PersistenceService 
{ 
    @PersistenceContext(unitName="pc") 
    EntityManager em; 

    public <T> void create(T entity) { 
     em.persist(entity); 
    } 
} 

第二個是業務:

@Stateless 
@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public class BusinessService implements 
{ 
    @EJB 
    PersistenceService persistenceService; 

    public <T> void register (User user) { 
      try{ 
        // Do some business 
        persistenceService.persist(user); 
        // Do other business 
      }catch(Exception e){ 
        // log exception 
        throw new BusinessException(e); 
      } 
     } 
} 

第三個是一個Web調用業務EJB的服務。

問題是,業務EJB不捕獲數據庫異常,例如封裝在EJB異常中的Mysql連接器拋出的約束違反異常。我可以在Rest服務EJB上處理這個異常,但不能在業務EJB上處理。我認爲這與交易有關。

我不確定哪些事務屬性應該添加到持久性EJB和業務EJB中,以讓我在業務EJB中捕獲這些類型的異常。

+0

爲什麼不能在業務層處理異常?你有沒有看到任何異常? – 2013-04-23 05:23:53

+0

,因爲異常發生在業務方法範圍之外的事務中。 – mmohab 2013-04-23 14:23:46

回答

0

你是對的,顯示的行爲可能與交易界限有關。您的Web服務(我現在正在猜測)是上層的非EJB層,因此當您調用BusinessService.register()時,事務就在調用之前開始,並在該調用返回之前結束。

運行時異常發生在提交時,您的情況發生在register()方法的代碼結束之後;因此在那裏處理它們爲時尚早。

你有兩個選擇,如果你真的不想處理的Web服務的bean例外:

一個。使用豆在BusinessService

@Stateless 
@TransactionManagement(TransactionManagementType.BEAN) 
public class BusinessService 
{ 
@EJB 
PersistenceService persistenceService; 
@Resource 
private UserTransaction ut; 

public <T> void register (User user) { 
     try{ 
       ut.begin(); 
       // Do some business 
       persistenceService.persist(user); 
       // Do other business 
       ut.commit(); 
     }catch(Exception e){ 
       // log exception 
       throw new BusinessException(e); 
     } 
    } 
} 

兩個管理的事務。在Web服務bean和EJB之間引入非事務外觀:

@Stateless 
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
public FacadeBean { 

    @EJB private BusinessService businessService; 

    public void facadeMethod(User user) { 
     try { 
      businessService.register(user); 
     } 
     // your handling code here 
     catch (...) { ... } 
    } 

} 
+0

感謝分享:),認爲非事務層更好,因爲我仍然喜歡容器管理事務。 – mmohab 2013-04-23 14:14:23