Nezískáte BatchUpdateException
, protože můžete použít SQLErrorCodeSQLExceptionTranslator
v jdbcTemplate
, který zpracovává BatchUpdateException
s zvláštním způsobem
:
if (sqlEx instanceof BatchUpdateException && sqlEx.getNextException() != null) {
SQLException nestedSqlEx = sqlEx.getNextException();
if (nestedSqlEx.getErrorCode() > 0 || nestedSqlEx.getSQLState() != null) {
sqlEx = nestedSqlEx;
}
}
Je v tom problém:
Tento problém můžete zmírnit, pokud použijete SQLStateSQLExceptionTranslator
:
jdbcTemplate.setExceptionTranslator(new SQLStateSQLExceptionTranslator());
Poté získáte BatchUpdateException
jako cause
:
try {
// ...
} catch (DataAccessException e) {
Throwable cause = e.getCause();
logger.info("cause instanceof BatchUpdateException = {}", cause instanceof BatchUpdateException);
}
Ale všimněte si, že v případě ovladače postgresql jdbc BatchUpdateException#getUpdateCounts()
bude obsahovat EXECUTE_FAILED
pouze, navzdory skutečnosti, že některý řádek mohl být úspěšně vložen.
Viz toto problém