2
respostas

Error while committing the transaction

Erro ao testar relacionamento com duas entidades

        Conta conta = new Conta();
        conta.setId(2L);

        Categoria c = new Categoria("Viagem");
        Categoria c2 = new Categoria("Negocios");

        Movimentacao m = new Movimentacao();
        m.setDescricao("Viagem a SP");
        m.setTipoMovimentacao(TipoMovimentacao.SAIDA);
        m.setData(LocalDateTime.now());
        m.setValor(new BigDecimal(300.0));
        m.setCategorias(Arrays.asList(c, c2)); 
        m.setConta(conta);

        Movimentacao m2 = new Movimentacao();
        m2.setDescricao("Viagem a RJ");
        m2.setTipoMovimentacao(TipoMovimentacao.SAIDA);
        m2.setData(LocalDateTime.now());
        m2.setValor(new BigDecimal(400.0));
        m2.setCategorias(Arrays.asList(c, c2));
        m2.setConta(conta);

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("alura");
        EntityManager em = emf.createEntityManager();

        em.getTransaction().begin();

        em.persist(c);
        em.persist(c2);
        em.persist(m);
        em.persist(m2);

        em.getTransaction().commit();
        em.close();

Segue erro abaixo:

WARN: SQL Error: 1062, SQLState: 23000
mar 26, 2020 12:16:06 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Duplicate entry '1' for key 'UK_nf3ulaoqe53gtm70wfwnpl79x'
mar 26, 2020 12:16:06 PM org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl release
INFO: HHH000010: On release of batch it still contained JDBC statements
Exception in thread "main" javax.persistence.RollbackException: Error while committing the transaction
    at org.hibernate.internal.ExceptionConverterImpl.convertCommitException(ExceptionConverterImpl.java:81)
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:104)
    at br.com.alura.jpa.testes.TestaRelacionamentoMovimentacaoCategoria.main(TestaRelacionamentoMovimentacaoCategoria.java:52)
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
    at org.hibernate.internal.ExceptionConverterImpl.convertCommitException(ExceptionConverterImpl.java:65)
    ... 2 more
2 respostas

Oi Henrique, tudo bem?

Faz um favor, posta o erro que vai dar rodando dessa formando, por favor:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("alura");
EntityManager em = emf.createEntityManager();

em.getTransaction().begin();        

Conta conta = new Conta();
conta.setId(2L);
em.persist(conta);

Categoria c = new Categoria("Viagem");
em.persist(c);

Categoria c2 = new Categoria("Negocios");
em.persist(c2);

Movimentacao m = new Movimentacao();
m.setDescricao("Viagem a SP");
m.setTipoMovimentacao(TipoMovimentacao.SAIDA);
m.setData(LocalDateTime.now());
m.setValor(new BigDecimal(300.0));
m.setCategorias(Arrays.asList(c, c2)); 
m.setConta(conta);
em.persist(m);

Movimentacao m2 = new Movimentacao();
m2.setDescricao("Viagem a RJ");
m2.setTipoMovimentacao(TipoMovimentacao.SAIDA);
m2.setData(LocalDateTime.now());
m2.setValor(new BigDecimal(400.0));
m2.setCategorias(Arrays.asList(c, c2));
m2.setConta(conta);
em.persist(m2);

em.getTransaction().commit();
em.close();

Bom dia Otávio, nesse código acredito que o erro se dá por causa que a conta que está sendo persistida já se encontra no banco.

Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: br.com.alura.jpa.modelo.Conta
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:708)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:688)
    at br.com.alura.jpa.testes.TestaRelacionamentoMovimentacaoCategoria.main(TestaRelacionamentoMovimentacaoCategoria.java:62)