1
resposta

Erro ao inserir duas movimentações

Quanto tento inserir duas movimentações, aparece uma mensagem de erro dizendo "Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '29' for key 'UK_nf3ulaoqe53gtm70wfwnpl79x'".

Tentei inseri-las uma a uma, comentando o em.persist(mv) ou mv2 e funcionou. Poderiam me ajudar?

package br.com.matheus.aulajpa.jpa.testes;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Arrays;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import br.com.matheus.aulajpa.jpa.modelo.Categoria;
import br.com.matheus.aulajpa.jpa.modelo.Conta;
import br.com.matheus.aulajpa.jpa.modelo.Movimentacao;
import br.com.matheus.aulajpa.jpa.modelo.TipoMovimentacao;

public class TestaRelacionamentoMovimentacaoCategoria {

    public static void main(String[] args) {


        Categoria categoria = new Categoria("Viagem");
        Categoria categoria2 = new Categoria("Negocio");

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


        Movimentacao mv = new Movimentacao();
        mv.setDescricao("Viagem a Curitiba");
        mv.setTipoMovimentacao(TipoMovimentacao.SAIDA);
        mv.setData(LocalDateTime.now());
        mv.setValor(new BigDecimal(300.0));
        mv.setCategorias(Arrays.asList(categoria, categoria2));
        mv.setConta(conta);

        Movimentacao mv2 = new Movimentacao();
        mv2.setDescricao("Viagem a SP");
        mv2.setTipoMovimentacao(TipoMovimentacao.SAIDA);
        mv2.setData(LocalDateTime.now());
        mv2.setValor(new BigDecimal(350.0));
        mv2.setCategorias(Arrays.asList(categoria, categoria2));
        mv2.setConta(conta);    


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

        em.getTransaction().begin();

        em.persist(categoria);
        em.persist(categoria2);
        em.persist(mv);
        em.persist(mv2);

        em.getTransaction().commit();

        em.close();


    }

}
1 resposta

Boa tarde!

Voce deveria separar em duas partes seu código. A geração do ID ficará igual no mesmo transaction, por isso dá erro.

Entre o mesmo begin e close eu recomendaria fazer uma persistencia só, e não duas.

em.getTransaction().begin();
        em.persist(categoria);
        em.persist(mv);
em.getTransaction().commit();
em.close();

em.getTransaction().begin();
        em.persist(categoria2);
        em.persist(mv2);
em.getTransaction().commit();
em.close();

Bons estudos!