No obtiene BatchUpdateException
, porque podría usar SQLErrorCodeSQLExceptionTranslator
en jdbcTemplate
, que maneja BatchUpdateException
s de una manera especial
:
if (sqlEx instanceof BatchUpdateException && sqlEx.getNextException() != null) {
SQLException nestedSqlEx = sqlEx.getNextException();
if (nestedSqlEx.getErrorCode() > 0 || nestedSqlEx.getSQLState() != null) {
sqlEx = nestedSqlEx;
}
}
Hay un problema al respecto:
Puede mitigar esto si usa SQLStateSQLExceptionTranslator
:
jdbcTemplate.setExceptionTranslator(new SQLStateSQLExceptionTranslator());
Luego obtendrá la BatchUpdateException
como una cause
:
try {
// ...
} catch (DataAccessException e) {
Throwable cause = e.getCause();
logger.info("cause instanceof BatchUpdateException = {}", cause instanceof BatchUpdateException);
}
Pero tenga en cuenta que en el caso del controlador postgresql jdbc BatchUpdateException#getUpdateCounts()
contendrá EXECUTE_FAILED
solo, a pesar de que alguna fila se pudo insertar con éxito.
Ver esto problema