Solución:
¿Cómo puedo saber que se violó una restricción única?
Las excepciones están encadenadas, tienes que llamar getCause()
recursivamente para obtener la excepción específica del proveedor (y tal vez ir a la SQLException
) para traducirlo en algo que su aplicación pueda manejar bien para su usuario. Lo siguiente imprimirá la cadena de excepción:
for (t = e.getCause(); t != null; t = t.getCause()) {
logger.debug("Exception:" + t);
}
Para el manejo de excepciones y la “traducción”, puede hacer algo como lo que hace Spring (consulte las distintas JpaDialect
clases, por ejemplo HibernateJpaDialect
para hacerse una idea).
Todo esto no es bueno, este código no será portátil y encontrar qué atributo (s) causó la violación no será fácil. Esto de alguna manera confirma que no existe una forma elegante y portátil de manejar las violaciones de restricciones en JPA.
Usar e.getCause()
para examinar qué causó la reversión.
el compilador devuelve la excepción SQLIntegrityConstraintViolationException, mientras intenta violar la restricción única.
Utilice el siguiente concepto de bloque de captura para manejar las excepciones adecuadas.
catch(SQLIntegrityConstraintViolationException e)
{
// Error message for integrity constraint violation
}
catch(Exception e)
{
// Other error messages
}