实现此用例的最佳方法是什么?
Image我有一个EJB A
,它是一种顶级的业务流程调用者。它调用其他bean。如果在调用其他bean期间发生异常,那么我想回滚A
完成的所有操作。
我想在A
bean中注入一次EntityManager,然后将其传递给其他bean。它被认为是一种很好的做法?
答案 0 :(得分:1)
使用容器管理事务,如下所述:https://docs.oracle.com/cd/E16439_01/doc.1013/e13981/servtran002.htm。
在A bean类上添加以下注释:@TransactionManagement(value = TransactionManagementType.CONTAINER)
以下关于A中调用其他bean的方法的注释:@TransactionAttribute(value = REQUIRED)
并确保其他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
}
}