Programa de cadastro, o que fazer com id repetido na hora de inclusão?

Cordiais saudações, pessoal do GUJ.

Estou praticando manipulação de cadastro. E agora surgiram algumas dúvidas. Já fiz um cinco programas de manutenção de cadastro mas o problema só me ocorreu agora. E o problema são as primary keys.

Fiz cadastro de cliente, cadastro de fornecedor, cadastro de produtos, cadastro de categorias, cadastro… vários cadastros, enfim. Mas só me ocorreu agora e toda vez que tento cadastrar um item que possui cadastro recebo a mensagem abaixo:

Preciso alterar a rotina de inclusão dos cadastros (todos) para fazer uma busca e verificar se existe id igual, os ids não são auto-incrementados, porque os id tem um significado de acordo com seu número.

Meus programas tem basicamente uma classe DAO para cada cadastro, e uma GuiCadastro que coleta os dados através de JTextField. Existe também uma classe DB que abre a conexão e uma classe que contém os campos dos cadastros. Onde digo cadastro entendam tabelas de um banco de dados, que por acaso se chama empresa.

Parece que a modificação deve ser feita na classe DAO, da seguinte forma: toda vez que mando incluir um registro ele faz uma busca na tabela e se existir um registro com primary key igual ele deve me mostrar uma mensagem e voltar para o campo codigo (chave).

Estou com dúvida sobre qual resposta o sistema me dá para eu saber que ele encontrou um registro com a chave que eu pretendia cadastrar.

Veja as linhas que pretendo acrescentar na minha classe DAO, no local de inclusão de registros:

sql = "select * from clientes where id_cgc_cpf = ?";
try {
    statement = bd.connection.prepareStatement(sql);
    statement.setString(1, cliente.getId_cgc_cpf());
    resultSet = statement.executeQuery();
...

Agora, depois de fazer a busca, como eu sei que ele encontrou um registro, ou não encontrou. Se ele não encontrou nenhum registro com a chave dada, então ele deve fazer o seguinte insert:

        sql = "insert into clientes values (?, ?, ?, ?, ?, ?, ? , ?, ?, ?, ?, ?, ?)";                
        statement = bd.connection.prepareStatement(sql);
        statement.setString(1, cliente.getId_cgc_cpf());
        statement.setString(2, cliente.getFisica_juridica());
        statement.setString(3, cliente.getNome_razao());
        statement.setString(4, cliente.getEmail());
        statement.setString(5, cliente.getTelefone());
        statement.setString(6, cliente.getCep());
        statement.setString(7, cliente.getEndereco());
        statement.setString(8, cliente.getNumero());
        statement.setString(9, cliente.getComplemento());
        statement.setString(10, cliente.getBairro());
        statement.setString(11, cliente.getCidade());
        statement.setString(12, cliente.getEstado());
        statement.setString(13, cliente.getData_cadastro());

Então, pessoal, eu pergunto: o que está faltando para eu testar se ele encontrou ou não o registro com a chave que pretendo cadastrar? Isto depois da linha resultSet = statement.executeQuery();.
Eu gostaria que alguém escreve-se o if para testar se encontrou ou não registro e caso tenha encontrado deve ser retornado return false;.

Atenciosamente,
Ronaldo

Imagino que você possa verificar se o seu select retornou registros usando o next(). Algo como:

resultSet = statement.executeQuery();

if (!resultSet.next()){ // não tem registros com esse cpf, então sem duplicação
  // faz o insert
} else{
  // avisa o usuário
}

Note que, como você está recebendo uma exceção, você pode usá-la para verificar, sem precisar fazer uma consulta nem if antes. Algo como:

try{
  // aqui você tenta fazer o insert
} catch(SQLIntegrityConstraintViolationException sic){
  // se deu exceção, vai cair aqui, e você avisa o usuário
}

Abraço.

1 curtida