Sie erhalten keine BatchUpdateException
, da Sie möglicherweise SQLErrorCodeSQLExceptionTranslator
in jdbcTemplate
, der BatchUpdateException
behandelt s auf besondere Weise
:
if (sqlEx instanceof BatchUpdateException && sqlEx.getNextException() != null) {
SQLException nestedSqlEx = sqlEx.getNextException();
if (nestedSqlEx.getErrorCode() > 0 || nestedSqlEx.getSQLState() != null) {
sqlEx = nestedSqlEx;
}
}
Es gibt ein Problem:
Sie können dies abschwächen, indem Sie den SQLStateSQLExceptionTranslator
:
jdbcTemplate.setExceptionTranslator(new SQLStateSQLExceptionTranslator());
Dann erhalten Sie die BatchUpdateException
als cause
:
try {
// ...
} catch (DataAccessException e) {
Throwable cause = e.getCause();
logger.info("cause instanceof BatchUpdateException = {}", cause instanceof BatchUpdateException);
}
Aber Beachten Sie, dass im Fall des Postgresql-JDBC-Treibers BatchUpdateException#getUpdateCounts()
enthält EXECUTE_FAILED
nur, obwohl einige Zeilen erfolgreich eingefügt werden konnten.
Siehe dies Problem