Что такое DataAccessException в Spring Framework?

«Что такое DataAccessException в Spring Framework?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

DataAccessException — это unchecked-исключение из пакета org.springframework.dao, являющееся корнем иерархии исключений Spring для доступа к данным. Его главная цель — абстрагировать приложение от специфичных исключений конкретных технологий (JDBC, JPA, Hibernate).

Зачем нужно?

  1. Унификация: Обёртывает SQLException (JDBC), PersistenceException (JPA), HibernateException в единую иерархию.
  2. Избавление от checked-исключений: Позволяет не объявлять throws в каждом DAO-методе, следуя принципам Spring.
  3. Семантическая классификация: Подклассы указывают на тип ошибки, а не на её источник.

Основные подклассы:

  • 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.
  • Упрощённое тестирование и обработка ошибок.
  • Согласованность в проектах, использующих несколько технологий доступа к данным.