Tratamento de SQLExceptions

E ai pessoal.

Trabalho com desenvolvimento java para desktop com jdbc, entretanto, já faz tempo que procuro uma ideia melhor para validação de campos obrigatórios, uniques, violação de chave estrangeira, primária, etc. Possuo uma classe que faz todas estas validações utilizando metadados. Por exemplo, quando eu vou persistir um objeto, faço um select que retorna uma linha da tabela onde vou fazer a persistência e obtenho os metadados deste registro, com base neles e em anotações que eu faço nos atributos da classe eu consigo fazer as validações. Apesar de eficiente, eu não acho correto esta ideia de fazer selects antes de tentar fazer o insert e fazer aquele monte de verificações na aplicação, a meu ver eu não deveria refazer as validações que são de responsabilidade do BD (integridade, obrigatoriedade, etc.) fazer. Eu não consegui encontrar na SQLException (e em nenhuma outra Exception) algum atributo que contenha qual constraint do BD foi violada e os campos envolvidos, se eu conseguisse isto poderia delegar esta responsabilidade ao indivíduo correto (o BD).

Desde já agradeço as sugestões.

saudações a um companheiro de plataforma de desenvolvimento… rsrsrs

Cara, na SQLException tem o método getErrorCode() que mostra informações mais específicas do erro que ocorreu. O duro é que são códigos específicos do SGBD, então o código de violação de PK para um Oracle vai ser um, pra um Postgresql com certeza vai ser outro (acredito eu). Mas pode ser um começo. Um amigo meu uma vez implementou algo assim: cada erro que ele interceptava durante a utilização da aplicação ele gravava numa tabela (desde que esse erro já não existisse lá). Nessa tabela tinha um campo do tipo texto onde ele colocava uma mensagem mais amigável para o usuário. Assim, com o tempo de uso da aplicação ele acabou meio que mapeando os erros do banco meio que sem fazer muito esforço, manjou ?

[quote=ADEMILTON]saudações a um companheiro de plataforma de desenvolvimento… rsrsrs

Cara, na SQLException tem o método getErrorCode() que mostra informações mais específicas do erro que ocorreu. O duro é que são códigos específicos do SGBD, então o código de violação de PK para um Oracle vai ser um, pra um Postgresql com certeza vai ser outro (acredito eu). Mas pode ser um começo. Um amigo meu uma vez implementou algo assim: cada erro que ele interceptava durante a utilização da aplicação ele gravava numa tabela (desde que esse erro já não existisse lá). Nessa tabela tinha um campo do tipo texto onde ele colocava uma mensagem mais amigável para o usuário. Assim, com o tempo de uso da aplicação ele acabou meio que mapeando os erros do banco meio que sem fazer muito esforço, manjou ? [/quote]

Compreendi sua ideia ADEMILTON, porém, gostaria de uma solução que apontasse para o usuário na mensagem de erro o(s) campo(s) envolvidos na exceção, por exemplo, “Já existe um registro com o mesmo valor informado em CPF”. Da forma como você sugeriu eu apenas consigo dizer que foi feita uma tentativa de violação de unicidade, sem ser específico em qual(is) campo(s) isso aconteceu porque o getErrorCode() não me retorna isto.

Indo por aí, pra esse exemplo acho que você tem duas metades do que precisa, uma vez que via metadados você consegue saber quais são os campos que estão definidos como unique na tabela