2017-05-29 79 views
0

實現此用例的最佳方式是什麼?用於長時間通話的JavaEE EntityManager

圖片我有一個EJB A這是一種頂級業務流程調用者。它調用其他bean。如果在其他bean的調用期間發生異常,那麼我想要回滾A完成的所有操作。

我想要在A bean中注入EntityManager一次,然後將它傳遞給其他bean。這被認爲是一種良好的做法?

回答

1

使用容器管理交易,如此處所述:https://docs.oracle.com/cd/E16439_01/doc.1013/e13981/servtran002.htm

把下面的註釋對你的bean類:@TransactionManagement(值= TransactionManagementType.CONTAINER)

而上的方法,在調用其他豆類以下注釋:@TransactionAttribute(值=必填)

並確保其他bean將拋出異常以回滾事務。

這只是一個簡單的用例,我強烈建議閱讀EJB事務管理。

實施例:

@Stateless 
public static class A{ 

     @PersistenceContext(unitName="a") 
     private EntityManager em = null; 

     @Inject 
     private B b = null; 

     @TransactionAttribute(TransactionAttributeType.REQUIRED) 
     public void doInTransaction(){ 
      //get some data from em 
      //modify and save back to b 
      b.save(data); 
     } 
} 

public static class B{ 
     @PersistenceContext(unitName="a") 
     private EntityManager em = null; 

     public void save(data){ 
      //save against em 
      //catch JPA exception and throw back as RuntimeException 
     } 
} 
+0

由於FOT尖端。我已經讀過關於事務管理的一些東西如果我正確理解,如果我使用事務管理,那麼實體管理器的注入是由它控制的?所以就像我向我的'A'注入Bean時,在'A'上指定事務管理,然後將實體管理器注入到其他bean中,然後注入由'A' bean的事務管理控制。我對嗎? –

+0

EntityManager注入由EJB容器控制,而不是由事務處理。您不必將EntityManager傳遞給A正在使用的其他bean。反過來,他們應該讓EntitytManager在創建時由容器注入,除非您通過「new」關鍵字在代碼中手動創建這些bean。 – tsolakp