用于长时间对话的JavaEE EntityManager

时间:2017-05-29 17:16:08

标签: ejb-3.0

实现此用例的最佳方法是什么?

Image我有一个EJB A,它是一种顶级的业务流程调用者。它调用其他bean。如果在调用其他bean期间发生异常,那么我想回滚A完成的所有操作。

我想在A bean中注入一次EntityManager,然后将其传递给其他bean。它被认为是一种很好的做法?

1 个答案:

答案 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
      }
}