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

HIBERNATE/JPA Método merge() inserindo novo registro em vez de atualizar

Estou tentando atualizar uma lista dentro da classe produto, consegui realizar isso adicionando cascade=CascadeType.ALL, porém dessa forma ao atualizar a composição é gerado um novo registro no banco.

Exemplo

List<Composicao> lista = criaLista(composicao1, composicao2); //Criando lista com 2 produtos
produtoExemplo.setLista(lista)
adiciona(produto); //Persiste o produto com a composicao no banco de dados 

//Momentos depois...
Produto produto = recupera(produtoExemplo);
produto.remove(composicao1);
manager.merge(produto);// Nesse momento  é criado novamente no banco de dados a composicao2 e adicionado ao produto, o problema é que vai ficar gerando lixo no banco de dados :(

Classe Produto

@Entity
public class Produto {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String nome;
    @ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    private List<Composicao> composicao;
}

Classe composicao

@Entity
public class Composicao {

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;
    @ManyToOne
    private Produto produto;
    private double quantidade;
}
2 respostas
solução!

Oi Kelvin, o merge só insere se o objeto não tiver id. Verifica isso no seu objeto.

Obrigado, já tinha resolvido e realmente era isso! Muito obrigado!