Caros,
Estou com um problema que achei, inicialmente que podia ser do OC4J ou Toplink (Essentials), rodando com JPA, mas vi que com o Hibernate ocorre o mesmo.
Estou lendo um arquivo onde cada linha tem os dados de um novo registro a grava no BD. Devo processar esse arquivo e gravar linha a linha os dados no BD. Faço isso com JPA (oc4j + toplink). Se algum registro dr algum pau, eu pulo para o próximo e sigo até o final, confirmando a transação, ou seja, grava os OK e os com erro não gravam.
Acontece que em todos os cenários (dentro ou fora oc4j, com toplink ou hibernate), ele faz rollback da transação toda depois que persisto um registro com erro (ex: chave duplicada ou valor longo demais para o campo).
Não entendi porque no final ele não confirma a transação.
Exemplo do código:
EntityManager em = getEntityManager();
// se rodo fora do oc4j, habilito a linha abaixo
//em.getTransaction().begin();
for( String linha: arquivo ) {
try {
MeuObj obj = new MeuObj();
// seta os valores da linha nos atributos do obj
em.persist(obj);
em.flush();
} catch(Exception e) {
e.printStackTrace();
}
} //for()
// se rodo fora do oc4j, habilito as linhas abaixo
//em.getTransaction().commit();
//em.close();
Erro com Hibernate:
Exception in thread "main" javax.persistence.RollbackException: Transaction marked as rollbackOnly
Erro com Toplink:
Caused by: javax.persistence.RollbackException: Transaction rolled back because transaction was set to RollbackOnly