Boa noite.
Pessoal tenho um problema a qual não estou conseguindo resolver.
Estou usando Hibernate 5 para fazer a persistência das minhas entidades
No meu Sistema tenho uma entidade chamada Cliente, o cliente possuo um campo rg e cpf que deve ser único e not null no banco de dados.
na minha classe de regra de negócio e estou validando o CPF assim
if(cliente.getCpf() == null || cliente.getCpf.getEquals(""))
throw RegraNegocioException("O campo CPF é obrigatório");
else{
//aqui eu verifico o código co cliente porque esse método ele salva ou atualiza a entidade
//no caso do código está != de nulo significa que está atualizando a entidade
if(cliente.getCodigo() != null && cpfExiste(cliente.getCpf()))
throw new RegraNegocioException("CPF ja está cadastrado");
}
//uso o método merge do entityManager para atualizar ou salvar a entidade
this.clienteDao.persistir(cliente);
Esse código funciona tanto para salvar a entidade como para atualizar(uso o merge do entityManager dentro do método persistir do clienteDao).
o problema é que com essa lõgica quando vou editar uma entidade e seto o campo cpf para um cpf que já existe ele erá duplica o cpf no banco de dados.
por exemplo vou cadastrar um novo cliente, o cadastro é feito normalmente, vou atualizar um novo cliente a atualização e feita normalmente e ele atualiza o cliente podendo trocar ou não o cpf, até ai está correto.
O problema é quando vou atualizar um segundo cliente ele, o sistema recupera o cpf atual dele, mas se eu quiser colocar o cpf do primeiro cliente e salvar, o sistema salva o segundo cliente e duplica o cpf no banco de dados.
Como posso fazer uma lógica para evitar isso ?