2014-03-07 84 views
0

我在EJB有一個實體管理器異常不與實體管理器cuaght

@PersistenceContext(unitName = "cnsbEntities") 
private EntityManager em; 

我填充的對象,然後我承諾在我的數據庫,但如果我有一個例外,重複ID,我可以沒有抓住它,我不知道爲什麼。

try{ 
     em.merge(boelLog); 
    } catch (Exception e){ 
     System.out.println("Generic Exception"); 
    } 

回答

1

JPA使用事務將實體修改發送到數據庫。您可以通過Bean Managed Transactions(BMT)手動指定這些事務,或讓應用程序服務器爲您執行(容器管理事務;默認值)。

因此,您需要在交易結束時捕捉異常,而不是在調用EntityManager類的merge()persist()方法之後。就你而言,當你從最後一個EJB對象返回時,事務可能會結束。

實施例爲容器管理事務(缺省值):

@Stateless 
public class OneEjbClass { 
     @Inject 
     private MyPersistenceEJB persistenceEJB; 

     public void someMethod() { 
      try { 
       persistenceEJB.persistAnEntity(); 
      } catch(PersistenceException e) { 
       // here you can catch persistence exceptions! 
      } 
     } 
} 

... 

@Stateless 
public class MyPersistenceEJB { 
     // this annotation forces application server to create a new 
     // transaction when calling this method, and to commit all 
     // modifications at the end of it! 
     @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
     public void persistAnEntity() { 
      // merge stuff with EntityManager 
     } 
} 

這是可能的,以指定當一個方法調用(或EJB的對象的任何方法調用)必須,可以或者不可以創建一個新的交易。這是通過@TransactionAttribute註釋完成的。默認情況下,EJB的每種方法都配置爲REQUIRED(與指定@TransactionAttribute(TransactionAttributeType.REQUIRED)相同),它告訴應用程序重用(繼續)調用該方法時處於活動狀態的事務,並根據需要創建新事務。

更多關於交易的位置:http://docs.oracle.com/javaee/7/tutorial/doc/transactions.htm#BNCIH

更多關於JPA和JTA這裏:http://en.wikibooks.org/wiki/Java_Persistence/Transactions