Обращение к ленивой коллекции после выхода из транзакции
Код разложен по слоям так:
@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
