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 đề