Obtener el campo y el nombre de la tabla que causó una excepción de un objeto de excepción SQL

StackOverflow https://stackoverflow.com/questions/829424

Pregunta

Estoy usando Hibernate JPA y Spring en mi proyecto. Supongamos que si intento insertar un registro con un valor de clave duplicado, la consulta de inserción arrojará una excepción.

Ahora, ¿es posible obtener el nombre de la tabla, el nombre del campo y la posible causa de la excepción del objeto Excepción SQL en tiempo de ejecución?

¿Fue útil?

Solución

Como las otras respuestas han mencionado, la mayoría de las veces está limitado a lo que le da la base de datos. Sin embargo, en algunos casos, Hibernate puede decirle el problema: no será la tabla y el campo, sino la entidad y la propiedad

Por ejemplo, si intenta poner un valor demasiado grande en una columna, puede usar esto:

try {
    entityManager.persist(object);

} catch (InvalidStateException e) {

    log.info("Caught Hibernate exception: #0", e.getClass().getName());

    InvalidValue[] invalidValues = e.getInvalidValues();

    for(InvalidValue invalidValue : invalidValues) {
        log.info("Invalid Property #0 has value: #1", invalidValue.getPropertyName(), invalidValue.getPropertyName());
    }
}

Otros consejos

Las excepciones SQLE tienden a envolver los errores de la base de datos, solo puede obtener ese tipo de información si se incluyó en el error que arrojó su base de datos. En mi experiencia de depuración de hibernación y material JDBC, me arriesgaría a que la respuesta a esta pregunta sea generalmente "no", pero puede haber excepciones.

hibernate envuelve SQLException como JDBCException e intenta convertirlo en una excepción completa más significativa como ConstraintViolationException usando SQLExceptionConverter que se adjunta a SessionFactory.

SQLException sqlException = ((JDBCException)ex).getSQLException(); 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top