Ответ
DataAccessException — это unchecked-исключение из пакета org.springframework.dao, являющееся корнем иерархии исключений Spring для доступа к данным. Его главная цель — абстрагировать приложение от специфичных исключений конкретных технологий (JDBC, JPA, Hibernate).
Зачем нужно?
- Унификация: Обёртывает
SQLException(JDBC),PersistenceException(JPA),HibernateExceptionв единую иерархию. - Избавление от checked-исключений: Позволяет не объявлять
throwsв каждом DAO-методе, следуя принципам Spring. - Семантическая классификация: Подклассы указывают на тип ошибки, а не на её источник.
Основные подклассы:
DuplicateKeyException— нарушение уникальности.DataIntegrityViolationException— нарушение целостности (например, внешний ключ).DeadlockLoserDataAccessException— взаимоблокировка.EmptyResultDataAccessException— ожидался результат, но ничего не найдено.IncorrectResultSizeDataAccessException— получено неверное количество строк.
Пример использования с JdbcTemplate:
@Repository
public class UserRepository {
private final JdbcTemplate jdbcTemplate;
public void updateEmail(Long userId, String email) {
try {
String sql = "UPDATE users SET email = ? WHERE id = ?";
jdbcTemplate.update(sql, email, userId);
} catch (DuplicateKeyException e) {
// Обработка дубликата email
throw new BusinessException("Email already exists", e);
} catch (DataIntegrityViolationException e) {
// Обработка других нарушений целостности
throw new BusinessException("Invalid data", e);
}
}
}
Преимущества:
- Код доступа к данным не зависит от низкоуровневого API.
- Упрощённое тестирование и обработка ошибок.
- Согласованность в проектах, использующих несколько технологий доступа к данным.