2
respostas

Transação BTM e CTM

Eu consigo usar CTM e BTM no mesmo projeto?

Se dá, como posso utilizar o BTM?

2 respostas

Você não pode alternar entre transações gerenciadas por contêiner e gerenciadas por bean no mesmo método. Mas você pode usar transações totalmente gerenciadas por bean em um Bean e em outro não. Porém, é mais comum usar um único tipo.

Mas quando tento usar o gerenciamento pelo BEAN sempra da o erro de, "java.lang.IllegalStateException: Transaction already active".

No caso, já tem uma transação aberta.

@TransactionManagement(TransactionManagementType.BEAN)
@Logger
public class PRPEscrita implements Escrita<Map<Path, List<Optional<Object>>>> {

    private static final int BATCH_SIZE_INSERT = 20;

    private EntityManagerFactory emf = Persistence.createEntityManagerFactory("primary");
    private EntityManager em;    

    private int contador = 0;
    private Proposta proposta;

    @Override
    public void escreve(Map<Path, List<Optional<Object>>> prps) {
        em = emf.createEntityManager();
        try {
            em.getTransaction().begin();
            prps.values().forEach(v -> v.forEach(objetoMapeado -> inserir(objetoMapeado)));
            em.getTransaction().commit();
        }catch(Exception e) {
            em.getTransaction().rollback();    
            throw e;
        }
    }
    private void inserir(Optional<Object> objetoMapeado) {
        if (objetoMapeado.isPresent()) {
            if (objetoMapeado.get() instanceof PropostaPRP) {
                proposta = (PropostaPRP) objetoMapeado.get();
                em.persist(getArquivoMovi(proposta));
                contador++;
                if (contador % BATCH_SIZE_INSERT == 0) {
                    em.flush();
                    em.clear();
                }
            }
        }
    }
}