问题是这样,我有三个EJB,EJB_A连接到服务器数据库1,EJB_B连接到服务器数据库2,第三个EJB_C负责调用前两个。
当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 :(得分:0)
嗯,要使其正常工作,您需要正确设置分布式事务(XA):
您需要删除注释:
@TransactionManagement(TransactionManagementType.BEAN)
让你的容器(实际上是他的事务代理)来管理事务而不是bean。 3.您需要在方法saveTwoEJBs上添加@TransactionAttribute注释:
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void saveTwoEJBs(EntityA, a, EntityB b)
这不是必需的,但没有理由通过JNDI上下文查找EJB bean,只需通过@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