Какие типичные проблемы возникают при работе с Spring Data JPA?

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

Ответ

Основные проблемы и их решения:

  1. Проблема N+1 запроса при ленивой (LAZY) загрузке коллекций.

    • Почему возникает: При выборке сущностей и последующем обращении к их коллекциям для каждой записи выполняется отдельный SQL-запрос.
    • Решение: Использовать JOIN FETCH в JPQL или аннотацию @EntityGraph.
      @EntityGraph(attributePaths = {"orders"})
      List<User> findAll();
  2. Сложность построения запросов через именованные методы.

    • Почему: Методы вроде findByDepartmentNameAndEmployeeStatus становятся громоздкими.
    • Решение: Для сложных условий использовать @Query с JPQL или нативным SQL.
      @Query("SELECT u FROM User u WHERE u.active = :status AND u.createdAt > :date")
      List<User> findActiveUsersAfter(@Param("date") LocalDate date, @Param("status") boolean status);
  3. Неявное управление транзакциями.

    • Почему: Методы репозитория по умолчанию @Transactional(readOnly = true), но для модифицирующих операций или цепочек вызовов нужен явный контроль.
    • Решение: Определять границы транзакций на уровне сервиса с помощью @Transactional и правильным выбором propagation.