Bạn không nhận được BatchUpdateException , vì bạn có thể sử dụng SQLErrorCodeSQLExceptionTranslator
trong jdbcTemplate , xử lý BatchUpdateException s theo một cách đặc biệt
:
if (sqlEx instanceof BatchUpdateException && sqlEx.getNextException() != null) {
SQLException nestedSqlEx = sqlEx.getNextException();
if (nestedSqlEx.getErrorCode() > 0 || nestedSqlEx.getSQLState() != null) {
sqlEx = nestedSqlEx;
}
}
Có một vấn đề về nó:
Bạn có thể giảm thiểu điều này nếu sử dụng SQLStateSQLExceptionTranslator
:
jdbcTemplate.setExceptionTranslator(new SQLStateSQLExceptionTranslator());
Sau đó, bạn sẽ nhận được BatchUpdateException như một cause :
try {
// ...
} catch (DataAccessException e) {
Throwable cause = e.getCause();
logger.info("cause instanceof BatchUpdateException = {}", cause instanceof BatchUpdateException);
}
Nhưng lưu ý rằng trong trường hợp trình điều khiển postgresql jdbc BatchUpdateException#getUpdateCounts() sẽ chứa EXECUTE_FAILED
chỉ, mặc dù thực tế là một số hàng có thể được chèn thành công.
Xem điều này vấn đề