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:
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.
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?
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?