Você pode também capturar o erro através de um SQLException, que é mais específico. Uma coisa interessante de olhar é o getErrorCode() dessa classe. Aí lá no catch você aplica o tratamento que quiser.
Faça um Select e verifique se esse ID já não se encontra cadastrado no Banco de Dados.
public void seuMetodoSalvar(Bean bean) throws SQLException {
String query = "Select * From Tabela Where ID = ?";
PreparedStatement statement = connection.prepareStatement(query);
statement.setLong(1, bean.getID());
ResultSet result = statement.executeQuery();
// se não retornar nenhum resultado, significa que o ID não existe no banco!
if (!result.next()) {
//...
}
}
Se ele fizer o acesso ao Banco de Dados com a mesma conexão ao invés de usar uma conexão para cada operação, a diferença de tempo fica praticamente inexistente. Além do mais, é mais seguro você controlar na mão do que depender de uma exceção para resolver seu problema, não acha?
Realmente o tempo de uma select é pequeno.
Mas usar exception não é menos seguro que uma select. Só tem que ver qual ele retorna quando o id já existe.
Além do mais, a manipulação de erro deve existir de uma forma ou de outra. A questão é só escolher as ações para cada tipo de exception.
[quote]Mas usar exception não é menos seguro que uma select. Só tem que ver qual ele retorna quando o id já existe.[/quote] Não seria melhor, ao invés de ficar fuçando e procurando o número da exception que gera para duplicações de chaves primárias, você fazer uma consulta que faça isso pra você, sendo muito mais legível?
Eu, por exemplo, prefiro fazer todo esse tipo de validação (quando não uso um framework) na mão, ao invés de esperar uma exception específica. Acho que fica mais inteligível pra quem também for fazer uso do código.
[quote]Além do mais, a manipulação de erro deve existir de uma forma ou de outra. A questão é só escolher as ações para cada tipo de exception.[/quote] Sim, mas eu acho que é legal você fazer a manipulação de erro quando este é algo que não se espera ou não tem como evitar.
Não consegui fazer a implementação através da exeção, quando o programa entra no Catch ele joga na tela todos os erros, isso atrapalha o funcionamento do meu programa.