Вступить в клуб →
лёгкаявопросPostgreSQL, JPA и производительность запросов

Обращение к ленивой коллекции после выхода из транзакции

Код разложен по слоям так:

@Service
public class OrderService {
    @Transactional(readOnly = true)
    public Order load(Long id) {
        return repository.findById(id).orElseThrow();
    }
}

@RestController
public class OrderController {
    @GetMapping("/orders/{id}")
    public OrderDto get(@PathVariable Long id) {
        Order order = service.load(id);
        return new OrderDto(order.getId(), order.getItems().size()); // items — LAZY
    }
}

В конфигурации приложения режим Open Session In View выключен: spring.jpa.open-in-view: false.

Что произойдёт при обращении к эндпоинту?

  • Вернётся DTO с нулевым количеством позиций: незагруженная коллекция считается пустой
  • Hibernate откроет новую сессию и догрузит позиции отдельным запросом
  • Будет выброшено LazyInitializationException: сессия закрыта при выходе из транзакционного метода
  • Будет выброшено NullPointerException: поле items осталось null

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела