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

[Dúvida] Toda vez que faço uma alteração hibernate faz o insert e não o update

Tenho uma classe de itens e outra de nota fiscal. Acontece que quando quero alterar a nota fiscal, ao invés de somente atualizar os seus itens, está sendo salvando novamente todos eles ao invés de atualizar.

Exemplo: Salvei dois itens na minha nota fiscal e desejo alterar a quantidade. Quando atualizo esta sendo inserida novamente a lista com os mesmos dois itens com a alteração ao invés de atualizar.

Minha classe nota:

@Entity(name = "Nota")
@Table(name = "nota")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Nota {

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

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_cliente")
    private Cliente cliente;

    @JsonManagedReference
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "nota", cascade = CascadeType.ALL)
    private List<Itens> itens;

    private Integer numero;
    private Date data;
    private BigDecimal valor_total;

Minha classe itens:

@Entity(name = "Itens")
@Table(name = "itens")
public class Itens {

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

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_produto")
    private Produto produto;

    @JsonBackReference
    @ManyToOne(fetch = FetchType.LAZY)
    private Nota nota;
    private Integer ordenacao;
    private BigDecimal quantidade;
    private BigDecimal valor_total;

Meu método de atualizar os itens:

   public void atualizar(NotaDTO dto) {
        Nota nota = repository.getReferenceById(dto.getId());

        if (!repository.existsById(dto.getId())) {
            throw new ValidacaoException("A nota fiscal informada não existe.");
        } else {
            int ordenacao = itensRepository.findByUltimaOrdencao(nota);
            BigDecimal somaTotal = BigDecimal.ZERO;

            for (Itens item : dto.getItens()) {
                item.setOrdenacao(ordenacao++);

                Long valorUnitario = produtoRepository.findByValorUnitarioProduto(item.getProduto().getId());

                item.setValor_total(item.getQuantidade().multiply(BigDecimal.valueOf(valorUnitario)));
                somaTotal = somaTotal.add(item.getValor_total());

                item.setNota(nota);
            }

            nota.setValor_total(somaTotal);

            nota.atualizar(dto);
        }
    }

Dentro da classe nota o método atualizar:

public void atualizar(NotaDTO dto) {
        if (dto.getCliente() != null) {
            this.cliente = new Cliente(new ClienteDTO());
        }
        if (dto.getItens() != null) {
            this.itens = dto.getItens();
        }
        if (dto.getData() != null) {
            this.data = dto.getData();
        }
        if (dto.getValor_total() != null) {
            this.valor_total = dto.getValor_total();
        }
    }

Alguém poderia me explicar o porque disto estar acontecendo?

3 respostas

Oi!

Você tem esse trecho de código:

if (dto.getItens() != null) {
    this.itens = dto.getItens();
}

Ele substitui a lista original da entidade e com isso o Hibernate vai fazer novos inserts na tabela.

Rodrigo,

Retirei esse trecho mas agora o hibernate faz apenas o select.... Teria mais alguma coisa errada no meu código? O json que estou enviando esta assim:

{
    "id": 15,
      "itens":[
        {
                        "id": 45,
                      "produto": 1,
            "quantidade": 2
        },
        {
                        "id": 46,
                        "produto": 2,
            "quantidade": 1
        },
        {
                        "id": 47,
            "produto": 3,
            "quantidade": 1
            },
            {
                        "id": 48,
            "produto": 4,
            "quantidade": 2
            }
    ]
}

Meu método de alterar, onde fiz algumas alterações:

    Nota nota = repository.getReferenceById(dto.getId());

        if (!repository.existsById(dto.getId())) {
            throw new ValidacaoException("A nota fiscal informada não existe.");
        } else {
            BigDecimal somaTotal = BigDecimal.ZERO;

            for (Itens item : dto.getItens()) {
              if (item.getId() == null) { //Adicionando item que não existe na nota fiscal
                  int ordenacao = itensRepository.findByUltimaOrdencao(nota) + 1;
                  somaTotal = repository.findbyValorTotalNota(dto.getId());
                  item.setOrdenacao(ordenacao++);

                  Long valorUnitario = produtoRepository.findByValorUnitarioProduto(item.getProduto().getId());

                  item.setValor_total(item.getQuantidade().multiply(BigDecimal.valueOf(valorUnitario)));
                  somaTotal = somaTotal.add(item.getValor_total());

                  item.setNota(nota);
              } else {
//                  int ordenacao = 1;
//                  item.setOrdenacao(ordenacao++);

                  Long valorUnitario = produtoRepository.findByValorUnitarioProduto(item.getProduto().getId());

                  item.setValor_total(item.getQuantidade().multiply(BigDecimal.valueOf(valorUnitario)));
                  somaTotal = somaTotal.add(item.getValor_total());

                  item.setNota(nota);
              }
            }
            nota.setValor_total(somaTotal);

            nota.atualizar(dto);
        }

No console fica da seguinte forma, onde os itens não são atualizados. A parte de inserir um novo item funcionou... Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Porque quando eu pego aquilo que já existe a tabela de itens não é atualizada?

solução!

O que acontecia era que estava recebendo duas listas diferentes, então precisava fazer as devidas verificações se o objeto existia ou não e por fim chamaos o método salvar.