2015-04-01 53 views
0

問題是這樣的,我有三個EJB,EJB_A連接到服務器數據庫1,EJB_B連接到服務器數據庫2,第三個EJB_C負責調用前兩個。是否有可能通過不同的EJB 3.1和多個數據庫服務器傳播事務?

當EJB_A或EJB_B出現錯誤時,只有在出現錯誤的EJB中執行回滾,而另一個EJB則保存正確完成,儘管它應該將回滾傳播到兩個EJB。

EJB_C:

@Stateless 
@LocalBean 
@TransactionManagement(TransactionManagementType.BEAN) 
public class EJB_C { 

    private EJB_A ejbA; 
    private EJB_B ejbB; 

    @PostConstruct 
    public void init(){ 
     Context context = null; 
     try { 
      context = new InitialContext(); 
      this.ayudanteSessionBean = (AyudanteSessionBean) context.lookup("java:global/Trans1/Trans1DBA/EJB_A"); 
      this.ayudanteSessionBean = (AyudanteSessionBean) context.lookup("java:global/Trans1/Trans1DBA/EJB_B"); 
     } catch (NamingException ex) { 
      Logger.getLogger(OrquestadorSessionBean.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public void saveTwoEJBs(EntityA, a, EntityB b){ 
     try{ 
      ejbA.save(a); 
      ejbB.save(b); 
     }catch (Exception ex) { 

     } 
    } 
} 

EJB_A:

@Stateless 
@LocalBean 
public class EJB_A { 
    @PersistenceContext(unitName = "persistA") 
    private EntityManager em; 

    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public void guardarAmigo(EntityA a){ 
     em.persist(a); 
    } 
} 

EJB_B:

@Stateless 
@LocalBean 
public class EJB_B { 
    @PersistenceContext(unitName = "persistB") 
    private EntityManager em; 

    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public void guardarAmigo(EntityB b){ 
     em.persist(b); 
    } 
} 

你能幫助我嗎?

+0

您沒有在EJB_C中創建事務,現在是BMT。使用'UserTransaction'對象手動創建它,或者通過移除'@TransactionManagement(TransactionManagementType.BEAN)'或切換到'@TransactionManagement(TransactionManagementType.CONTAINER)'來改變爲CMT。 – Gas 2015-04-02 20:46:51

+0

爲什麼您在使用EJB時​​對bean管理事務感興趣?例如,除非明確需要bean管理事務,否則您應該使用容器管理的事務 - 例如,您可能必須在服務層之外轉儲業務邏輯。 – Tiny 2015-04-04 08:08:16

回答

0

好,使之工作,你需要設置分佈式事務(XA)正確:

  1. 檢查所有數據源是XA-準備。通常,這意味着在安裝過程中不同的jdbc驅動程序類名稱和不同類型的連接池。 該過程由供應商指定,但始終在應用程序服務器的文檔中描述。
  2. 您需要刪除註釋:

    @TransactionManagement(TransactionManagementType.BEAN)

,讓你的容器(其實他的交易經紀人)來管理事務,而不是豆。 3.您需要在方法saveTwoEJBs添加註解@TransactionAttribute:

@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public void saveTwoEJBs(EntityA, a, EntityB b) 
  • 它不是必需的,但沒有任何理由通過JNDI上下文查找EJB豆,只是它們注入通過@EJB批註:

    @EJB 
    private EJB_A ejbA; 
    @EJB 
    private EJB_B ejbB; 
    
  • 一些鏈接去:

    http://docs.oracle.com/cd/E13222_01/wls/docs100/ejb30/examples.html http://docs.oracle.com/cd/E16439_01/doc.1013/e13981/servtran001.htm http://entjavastuff.blogspot.ru/2011/02/ejb-transaction-management-going-deeper.html

    +0

    感謝所有的信息,它非常有用 – Aphs 2015-04-07 17:42:35

    相關問題