Nie otrzymujesz BatchUpdateException
, ponieważ możesz użyć SQLErrorCodeSQLExceptionTranslator
w jdbcTemplate
, który obsługuje BatchUpdateException
s w specjalny sposób
:
if (sqlEx instanceof BatchUpdateException && sqlEx.getNextException() != null) {
SQLException nestedSqlEx = sqlEx.getNextException();
if (nestedSqlEx.getErrorCode() > 0 || nestedSqlEx.getSQLState() != null) {
sqlEx = nestedSqlEx;
}
}
Jest z tym problem:
Możesz to złagodzić, jeśli użyjesz SQLStateSQLExceptionTranslator
:
jdbcTemplate.setExceptionTranslator(new SQLStateSQLExceptionTranslator());
Następnie otrzymasz BatchUpdateException
jako cause
:
try {
// ...
} catch (DataAccessException e) {
Throwable cause = e.getCause();
logger.info("cause instanceof BatchUpdateException = {}", cause instanceof BatchUpdateException);
}
Ale zauważ, że w przypadku sterownika jdbc postgresql BatchUpdateException#getUpdateCounts()
będzie zawierać EXECUTE_FAILED
tylko, pomimo faktu, że niektóre wiersze można było wstawić z powodzeniem.
Zobacz to wydanie