Você não recebe
BatchUpdateException
, porque você pode usar SQLErrorCodeSQLExceptionTranslator
em jdbcTemplate
, que lida com BatchUpdateException
s de uma maneira especial
:if (sqlEx instanceof BatchUpdateException && sqlEx.getNextException() != null) {
SQLException nestedSqlEx = sqlEx.getNextException();
if (nestedSqlEx.getErrorCode() > 0 || nestedSqlEx.getSQLState() != null) {
sqlEx = nestedSqlEx;
}
}
Há uma questão sobre isso:
Você pode atenuar isso se usar o
SQLStateSQLExceptionTranslator
:jdbcTemplate.setExceptionTranslator(new SQLStateSQLExceptionTranslator());
Então você receberá o
BatchUpdateException
como uma cause
:try {
// ...
} catch (DataAccessException e) {
Throwable cause = e.getCause();
logger.info("cause instanceof BatchUpdateException = {}", cause instanceof BatchUpdateException);
}
Mas note que no caso do driver jdbc postgresql
BatchUpdateException#getUpdateCounts()
conterá EXECUTE_FAILED
apenas, apesar do fato de que alguma linha pode ser inserida com sucesso. Veja este questão