Ответ
Основные проблемы и их решения:
-
Проблема N+1 запроса при ленивой (
LAZY) загрузке коллекций.- Почему возникает: При выборке сущностей и последующем обращении к их коллекциям для каждой записи выполняется отдельный SQL-запрос.
- Решение: Использовать
JOIN FETCHв JPQL или аннотацию@EntityGraph.@EntityGraph(attributePaths = {"orders"}) List<User> findAll();
-
Сложность построения запросов через именованные методы.
- Почему: Методы вроде
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);
- Почему: Методы вроде
-
Неявное управление транзакциями.
- Почему: Методы репозитория по умолчанию
@Transactional(readOnly = true), но для модифицирующих операций или цепочек вызовов нужен явный контроль. - Решение: Определять границы транзакций на уровне сервиса с помощью
@Transactionalи правильным выборомpropagation.
- Почему: Методы репозитория по умолчанию