問題是這樣的,我有三個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);
}
}
你能幫助我嗎?
您沒有在EJB_C中創建事務,現在是BMT。使用'UserTransaction'對象手動創建它,或者通過移除'@TransactionManagement(TransactionManagementType.BEAN)'或切換到'@TransactionManagement(TransactionManagementType.CONTAINER)'來改變爲CMT。 – Gas 2015-04-02 20:46:51
爲什麼您在使用EJB時對bean管理事務感興趣?例如,除非明確需要bean管理事務,否則您應該使用容器管理的事務 - 例如,您可能必須在服務層之外轉儲業務邏輯。 – Tiny 2015-04-04 08:08:16