EntityExistsException (Hibernate) - Zerando um ArrayList e recarregando antes de persistir

2 respostas
ormhibernate
aboult

Boa tarde.

Estou tendo um problema (EntityExistsException) ao tentar zerar um ArrayList, recarregá-lo com novos dados e gravar ao final do processo completo do form.

A situação seria a seguinte, eu tenho uma coleção de PedidoItem em minha entidade Pedido:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "pedido", orphanRemoval = true)
private List<PedidoItem> itens;

Essa coleção já vem carregada, mas o usuário pode trocar a Nota de Origem vinculada e recarregar os itens, então estava tentando zerar o ArrayList e preenchê-lo com as novas informações.

Mas neste momento, não posso efetivar a remoção dos itens, pois o usuário pode vincular uma nova Nota e simplesmente cancelar a alteração do Pedido.

pedido.setItens(new ArrayList<>());

nfeFiltro.getProdutos().stream()
    .forEach(nfeProduto -> {
        PedidoItem pedidoItem = new PedidoItem();
        pedidoItem.setPedido(pedido);

        PedidoItemId pedidoItemId = new PedidoItemId();
        pedidoItemId.setPedidoLinha(nfeProduto.getId().getNfeNumeroDoItem());
        pedidoItem.setId(pedidoItemId);

Como eu poderia resolver esta situação? Eu já manipulei o EqualsAndHashCode do PedidoItem e fiz outras alterações que não resolveram.

A única forma que consegui resolver, foi fazendo o que não queria. Usando o em.remove() para cada item da lista antes de recarregá-la.

Obrigado desde já.

2 Respostas

darlan_machado

Deixa eu ver se entendi, negocialmente é permitido remover um item de uma nota e associar a outra?
Se for isso, qual a razão de remover TODOS os itens ao invés de remover só os que foram modificados?

aboult

Darlan,

A regra não seria essa no caso. Imagine uma devolução de venda, eu já tenho a nota fiscal que foi enviada para o cliente, vamos supor que ela tenha 10 itens.
Nós vamos fazer esse pedido de devolução de venda com base nesta nota, mas vamos supor que o usuário entrou no pedido e gerou uma devolução de venda com a nota errada (5 itens).
Após isso ele vai abrir novamente e colocar a correta que são os 10 itens.

Ou seja, eu teria que excluir todos os itens do meu Pedido (5 itens) e preencher ele com os 10 itens da nota correta.

Quando eu faço esse tipo de procedimento, o Hibernate retorna a exceção, pois a composição do Id do PedidoItem é (PedidoId, LinhaId), então ele me diz como se eu estivesse inserindo o mesmo item novamente, sendo que não é.

Tentei usar o flush, recarregar o pedido e mesmo assim não funcionou.

A maneira que acabou funcionando foi:

if (CollectionUtils.isNotEmpty(pedido.getItens())) {
            pedido.getItens().stream().forEach(i -> removeDetached(getEntityManager(), i));
            pedido.setItens(new ArrayList<>());
        }

Mas na verdade não queria realizar o detached, pois ele exclui os itens. Vamos supor que eu tenha entrado nesse pedido, mas vou cancelar a edição ou mesmo se ocorrer algum tipo de problema não tratado após esse processo, o pedido ficaria sem itens.

Há alguma maneira correta de fazer esse tipo de processo?

Obrigado desde já pela atenção.

Criado 28 de fevereiro de 2018
Ultima resposta 11 de abr. de 2018
Respostas 2
Participantes 2