Vous n'obtenez pas BatchUpdateException
, car vous pourriez utiliser SQLErrorCodeSQLExceptionTranslator
dans jdbcTemplate
, qui gère BatchUpdateException
s d'une manière spéciale
:
if (sqlEx instanceof BatchUpdateException && sqlEx.getNextException() != null) {
SQLException nestedSqlEx = sqlEx.getNextException();
if (nestedSqlEx.getErrorCode() > 0 || nestedSqlEx.getSQLState() != null) {
sqlEx = nestedSqlEx;
}
}
Il y a un problème à ce sujet :
Vous pouvez atténuer cela, si vous utilisez le SQLStateSQLExceptionTranslator
:
jdbcTemplate.setExceptionTranslator(new SQLStateSQLExceptionTranslator());
Ensuite, vous obtiendrez le BatchUpdateException
comme cause
:
try {
// ...
} catch (DataAccessException e) {
Throwable cause = e.getCause();
logger.info("cause instanceof BatchUpdateException = {}", cause instanceof BatchUpdateException);
}
Mais notez qu'en cas de pilote jdbc postgresql BatchUpdateException#getUpdateCounts()
contiendra EXECUTE_FAILED
seulement, malgré le fait que certaines lignes ont pu être insérées avec succès.
Voir ceci problème