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

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á.

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?

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.