Capturar violação de chave estrangeira [RESOLVIDO]

Pessoal, boa tarde.

Eu estou com uma aplicação que possui duas tabelas especificas relacionadas.
Uma tem uma chave estrangeira da outra.
Logo, quando tento deletar um registro de uma tabela que tem uma referencia em outra, o mysql não permite.

Então, como eu capturo essa situação para enviar uma mensagem para o usuário?!

Procure por CASCADE no mysql.

O Cascade só vai apagar tudo que referencia seu registro ao ser excluído.

O que vc precisa é aprender sobre tratamento de exeções.
Quando acontece isso é lançada uma exeção. É só saber capturá-la e tratá-la!

Valeu ? Ou precisa de algum tuto ?
Se precisar de algum tutorial no site da caelum tem um de java básico muuuito bom !

Boa tarde

Como o pessoal falou acima o CASCADE pode te ajudar caso você queria que quando excluir da tabela principal apague também os dados relacionados, mas caso você queria realizar um tratamento, aconselho a você dar uma olhada na hierarquia de classes de SQLException, assim vai conseguir saber quando uma exceção é lançada e o tipo de erro que gerou, como por exemplo erros relacionados a foreign key.

Dê uma olhada http://java.sun.com/javase/6/docs/api/java/sql/SQLException.html

Falou.

Pois é pessoal, valeu pelas respostas!

Não é o Cascade que eu procuro!

Eu quero exatamente uma forma de tratar essa exceção, só que, o SQLException não lança essa exceção!
Quer dizer, eu tentei capturar da maneira básica

}catch(SQLException sqlException){

}

Se alguem souber como eu capturo essa exceção…

Obrigado!!

[quote=RenatoDeSouza]… Quer dizer, eu tentei capturar da maneira básica
}catch(SQLException sqlException){

}…[/quote]@RenatoDeSouza oi,
Caso vc ainda não tenha conseguido, vc poderia tentar (a IDE q vc usa ó o Eclipse?) fazer o seguinte:

  1. Retire sua operação de Banco do bloco Try Catch;
  2. O Eclipse vai “reclamar” de alguma coisa;
  3. (não tente solucionar manualmente, pelo contrario: )Utilize a ferramenta do Eclise q gera o tratamento automaticamente para vc.

Bem, p/ex.: num projeto q eu estou, q usa o Hibernate Template do Spring, ela sempre me gera isto:

} catch (DataAccessResourceFailureException e) { Logger.getLogger(PedidoDaoImpl.class.getName() ).log(Level.SEVERE, null, e); throw new Exception("\nFalha em PedidoDaoImpl.recuperarPedidosSolicitadosPelo(): " + e.getMessage() ); } catch (HibernateException e) { Logger.getLogger(PedidoDaoImpl.class.getName() ).log(Level.SEVERE, null, e); throw new Exception("\nFalha em PedidoDaoImpl.recuperarPedidosSolicitadosPelo(): " + e.getMessage() ); } catch (IllegalStateException e) { Logger.getLogger(PedidoDaoImpl.class.getName() ).log(Level.SEVERE, null, e); throw new Exception("\nFalha em PedidoDaoImpl.recuperarPedidosSolicitadosPelo(): " + e.getMessage() ); }

Se entendi bem você está usando JDBC (e não hibernate) e quer saber quando uma FK foi violada, correto?

A principio não tem como, pois o JDBC é muito genérico, e tudos os métodos lançam uma SQLException genérica. Não há, por exemplo, uma ViolationException extends SQLException.

O que você pode fazer é a partir da mensagem na SQLException saber qual o erro aconteceu. Por exemplo, se você receber uma SQLException com a mensagem “Operation violates the xxxx constraint”, basta você ler a mensagem e tratar ela.

Olá pessoal!

Isso, não estou usando Hibernate. To usando JDBC.

Pois é Garcia, eu tentei fazer isso, tratar a mensagem!
Mas, o SQLException não gera nenhuma mensagem de FK violada…
Pelo menos ate agora não descobri!

Vou continuar tentando!
Valeu pessoal.

Qual o banco de dados que você usa? Você quer apenas saber se há uma violação de FK ou quer saber QUAL FK?

No pgsql você precisa pegar a Exception.getRootCause para saber a mensagem real.

Olá Garcia, obrigado pela resposta.

Quero saber só se existe uma violação de FK.
Nessa aplicação to usando o MySQL!

Tá resolvido o problema pessoal.

Esqueci de colocar o Throws SQLException no meu método que chamava o executeUpdate.

Valeu!