Eu consigo usar CTM e BTM no mesmo projeto?
Se dá, como posso utilizar o BTM?
Eu consigo usar CTM e BTM no mesmo projeto?
Se dá, como posso utilizar o BTM?
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();
}
}
}
}
}