[Resolvido] Hibernate deletado registro da tabela associativa, como evitar?

Boa noite pessoal, estou com a seguinte duvida: Eu estou usando o Hibernate para mapear o meu banco de dados, tenho um relacionamento ManyToMany entre venda e produtos e este relacionamento criou a tabela venda_produtos, o meu problema é que toda vez que atualizo um campo na tabela venda o hibernate deleta os registros da minha tabela venda_produtos. Estou estudando o parametro updatable e insertable mas não estou conseguindo fazer eles funcionarem. Alguém sabe como posso manter os dados desta tabela intectos mesmo quando atualizo a tabela vendas?

Temos dois pontos aí: por quê precisa alterar campos na tabela venda? Teoricamente, cada venda realizada não deveria permanecer ali, imutável? Ok, não vou questionar a forma como você está fazendo as coisas.

Depois, o que deve estar ocorrendo é que você, no momento de inserir, faz a associação entre a venda e os produtos e vice-versa.
Porém, quando realiza update, não associa, deixando a lista de produtos vazia ou incompleta.
Isso faz com que o hibernate não encontre relação entre venda e produto e exclua o registro da tabela associativa.
Não tem a ver com updatable ou insertable, mas, com a forma que você está executando as ações.

Então, quando digo venda, na verdade ela ainda é um pedido, controlo ela pelo status, ABERTA, FECHADA, CANCELADA… quando realizo uma operação na qual tenho que alterar o status dela, o hibernate realiza o delete na tabela associativa. Resolvi o problema da seguinte forma:

if ((venda.getCodigo() != null || !venda.getProduto().isEmpty())) {
        List<Produto> produtosVenda = vendaProdutos.listaProdutosVendaCod(venda.getCodigo());
        venda.setProduto(produtosVenda);
    }

Recupero os produtos associados a ela e coloco no setProduto.

então salvo a venda e ela mantem os produtos dela, só que toda vez que realizo esse processo ela gera um novo ID para os registros da tabela venda_produtos e isso esta me incomodando, não me parece a forma correta de resolver este problema.

No meu entendimento, pedido é pedido e venda é venda. Se eu fosse modelar, criaria tabelas distintas para cada um deles.
Se o pedido for cancelado, vai ser a mesma coisa de venda cancelada? Entendo que não. O pedido cancelado não gerou NF, logo, não precisa cancelar a NF e todo o trâmite legal necessário. Já uma venda, sim, tem NF e, por isso, precisa cancelar esse documento, entre outros trâmites burocráticos.

Você pode questionar a razão de termos duas tabelas sendo que com uma só consegue resolver. Sim, consegue, mas, terá problemas com a adaptação para o hibernate.
A pergunta que não quer calar é: precisa, realmente, do hibernate?
Entenda, o hibernate é uma ótima ferramenta, mas, não atende a todos os cenários.

Esse tipo de problema, quero resolver com o haibernate, pois é o framework que estou estudando no momento, quero entender ele mais a fundo. A questão de ter pedido e venda em tabelas separadas faz sentido, vou reanalizar esta parte, mas ainda consigo controlar esse lance da nota pelo status, pois o sistema só considera venda quando o status = FECHADO, logo tera esse tipo de validação na hora de cancelar uma nota ou gerar a mesma.

Entao o ideal é fazer um curso ou seguir um livro. Hibernate é super complexo e mal uso pode causar desastres ou deixar você perdido por várias horas. Como darlan falou, o ideal é não usar sem ter a real necessidade, por ser pesado etc, mas em relação a aprendizado para mercado, não é aos trancos e barracos que deveria estudar, principalmente Hibernate.

Assim, estou fazendo isso, estudando bastante para comprende-lo melhor, assim que eu conseguir resolver este problema, posto a solução aqui, obrigado aos dois pelas dicas.

O problema estava ocorrendo por que eu estava recebendo um objeto do tipo venda, prenchido com informações parciais e já estava tentando salva-lo, quando na verdade devia buscar a venda no banco, modificar as infomações que eu recebi e depois salvar esta venda.

Ex:
Venda venda2 = vendas.findOne(venda.getCodigo);

venda2.setObservacao(venda.getObservacao);

vendas.save(venda2);

Muito obrigado pelas dicas de vcs!

Funcionar funciona, mas não é eficiente. Terá um select e depois um update.

Além disso, esse update está atualizando todos os campos da tabela a toa. Para atualizar alguns campos com Hibernate, o mais eficiente é usar HQL.

Muito obrigado pela dica, vou seguir este modelo que vc me passou, tem muitas consultas que já estou utilizado hql e até query nativas, estou focando em boas praticas com hibernate. Muito obrigado pelas dicas de vcs, esta me ajudando a ter uma compreensão maior sobre a responsabilidade de estar usando algumas tecnologias, como o próprio hibernate.

Existem várias formas de “fazer funcionar” com Hibernate, geralmente o mais fácil custa mais para o resultado.

SQL nativo sem dúvidas é a opção mais eficiente, sem hibernate melhor ainda.

Fiz o update com jpql, modificando apenas os dados que quero, vlw pessoal, vcs são show.