Problema com lógica de regra de negócio

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 ?