Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Erro no Relacionamento

Ao tentar inserir a movimentacao2 estou com o seguinte erro de Constraint, consigo inserir uma por execução só.

ERROR: HHH000346: Error during managed flush [org.hibernate.exception.ConstraintViolationException: could not execute statement]
Exception in thread "main" javax.persistence.RollbackException: Error while committing the transaction


public class TesteMovimentacoesComCategoria {

    public static void main(String[] args) {

        Categoria categoria1 = new Categoria("Viagem");
        Categoria categoria2 = new Categoria("Negócios");

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

        Movimentacao movimentacao1 = new Movimentacao();
        movimentacao1.setData(Calendar.getInstance());
        movimentacao1.setDescricao("Mercadinho");
        movimentacao1.setTipo(TipoMovimentacao.SAIDA);
        movimentacao1.setValor(new BigDecimal("400.0"));
        movimentacao1.setCategorias(Arrays.asList(categoria1, categoria2));

        movimentacao1.setConta(conta);


        Movimentacao movimentacao2 = new Movimentacao();
        movimentacao2.setData(Calendar.getInstance());
        movimentacao2.setDescricao("Casa Nostra");
        movimentacao2.setTipo(TipoMovimentacao.SAIDA);
        movimentacao2.setValor(new BigDecimal("500.0"));
        movimentacao2.setCategorias(Arrays.asList(categoria1, categoria2));

        movimentacao2.setConta(conta);



        EntityManager em = new JPAUtil().getEntityManager();
        em.getTransaction().begin();

        em.persist(categoria1); // Agora a 'categoria1' é Managed
        em.persist(categoria2); // Agora a 'categoria2' é Managed

        em.persist(movimentacao1);
        em.persist(movimentacao2);


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

    }

}
6 respostas

oi Wellington tudo bem ? você consegue postar sua classe movimentação aqui?

Segue ...

@Entity
public class Movimentacao {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;

    private BigDecimal valor;

    @Enumerated(EnumType.STRING)
    private TipoMovimentacao tipo;

    @Temporal(TemporalType.TIMESTAMP)
    private Calendar data;

    private String descricao;

    @ManyToOne
    private Conta conta;

    @ManyToMany
    private List<Categoria> categoria;

    public BigDecimal getValor() {
        return valor;
    }

    public void setValor(BigDecimal valor) {
        this.valor = valor;
    }

    public TipoMovimentacao getTipo() {
        return tipo;
    }

    public void setTipo(TipoMovimentacao tipo) {
        this.tipo = tipo;
    }

    public Calendar getData() {
        return data;
    }

    public void setData(Calendar data) {
        this.data = data;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public Conta getConta() {
        return conta;
    }

    public void setConta(Conta conta) {
        this.conta = conta;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public List<Categoria> getCategoria() {
        return categoria;
    }

    public void setCategorias(List<Categoria> categoria) {
        this.categoria = categoria;
    }


}

Wellington, confere se sua classe categoria, o atributo id esta assim:

@Entity
public class Categoria {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
...
}
solução!
Consegui resolver aqui, foi da seguinte forma

Dropei as tabelas "hibernate_sequence" e "movimentacao_categoria"

Deletei todos os registros das tabelas "categoria" e "movimentacao".

Mudei @GeneratedValue(strategy = GenerationType.IDENTITY) para @GeneratedValue(strategy = GenerationType.AUTO) em todas as classes

Obrigado pela ajuda, abraços!!

Que ótimo :), vou marcar como solucionado.