Передайте функцию перед вызовом функции в другом EJB при использовании JTA - PullRequest
0 голосов
/ 24 апреля 2019

@ Publicless (name = "A") открытый класс A {

    @PersistenceContext
    private EntityManager entityManager;

    @EJB
    private B serviceB;

    public void doSomeProcessA(List<AnyEntity> entities) {
        for (AnyEntity entity: entities) {
            //do some process.
            entityManager.persist(entity);
            serviceB.b(entity.getPrimaryKey());
        }

    }
}

@Stateless(name = B)
public class B {
    @PersistenceContext
    private EntityManager entityManager;

    @Resource
    private SessionContext sessionContext;

    public void b (String id) {
        AnyEntity entity = entityManager.find(AnyEntity.class, id);

        try {
            //do some process

            entityManager.merge(entity);
        } catch (Exception e) {
            sessionContext.setRollbackOnly();
        }
    }
}

это мой сценарий.Я хочу сохранить сущность в первую очередь.И сделать некоторые другие изменения в сущности в функции b.Если возникает какое-либо исключение, я хочу сделать откат обновления транзакции объекта, но я хочу сохранить постоянный объект.

Если я использую этот код в качестве примера, если произойдет какое-либо исключение, персистентные сущности не будут зафиксированы.Если я использую @TransactionAttribute (TransactionAttributeType.REQUIRES_NEW) для функции, процесс не завершен в службе A, транзакция не завершена и не записана в db, я не могу достичь сущности в службе B. Я не могу изменить b как b (сущность AnyEntity), потому чтобизнес-логики, которую мы используем.Что я могу сделать, чтобы решить эту проблему.

1 Ответ

0 голосов
/ 24 апреля 2019

ты пробовал?

 @Stateless(name = "A") 
 @TransactionManagement(TransactionManagementType.BEAN)
 public class A {

    @PersistenceContext
    private EntityManager entityManager;

    @Resource
    private UserTransaction transaction;

    @EJB
    private B serviceB;

    public void doSomeProcessA(List<AnyEntity> entities) {
        for (AnyEntity entity: entities) {
          try {
            //do some process.
            transaction.begin();

            entityManager.persist(entity);

            transaction.commit();

            serviceB.b(entity.getPrimaryKey());
         } catch (Exception e) {
           try {
             this.transaction.rollback();
               } catch (IllegalStateException | SecurityException
                       | SystemException e1) {
                e1.printStackTrace();
            }
        }

    }
}

@Stateless(name = B)
public class B {
    @PersistenceContext
    private EntityManager entityManager;    

    @Transactional(value = Transactional.TxType.REQUIRES_NEW, rollbackOn = Exception.class)
    public void b (String id) {
        AnyEntity entity = entityManager.find(AnyEntity.class, id);
        //do some process    
        entityManager.merge(entity);
    }
}
...