FetchType и загрузка данных

Базовый Java
≈ 1 мин чтения

Связанным данным не всегда нужно загружаться одновременно

Когда JPA получает Entity, у неё могут быть связанные объекты и коллекции. Загружать весь граф сразу дорого, но откладывать всё без исключения тоже неудобно. Для этого в отображении связей используется стратегия загрузки.

EAGER и LAZY выражают разные намерения

@ManyToOne(fetch = FetchType.LAZY)
private User user;

EAGER требует, чтобы связанное состояние было доступно как часть загрузки Entity. LAZY означает, что загрузку можно отложить до момента, когда связь действительно понадобится. При этом конкретное количество SQL-запросов определяется provider и самим запросом, а не только одной аннотацией.

Загрузка — часть проектирования запроса

Если экрану нужны заказы вместе с пользователями, эти данные стоит получать осознанно. Если пользователи вообще не используются, их загрузка только увеличит объём работы. Поэтому FetchType — не переключатель «быстро/медленно», а часть решения о том, какие данные нужны конкретному сценарию.

LAZY не означает «запросов точно будет меньше». Неаккуратный доступ к отложенным связям может, наоборот, породить множество дополнительных запросов — позже разберём это как N+1 проблему.