Ответ
Hibernate использует разные стратегии загрузки по умолчанию для разных типов ассоциаций, чтобы сбалансировать производительность и удобство.
Правила по умолчанию:
FetchType.EAGER(жадная загрузка): Для@ManyToOneи@OneToOne.FetchType.LAZY(ленивая загрузка): Для@OneToManyи@ManyToMany.
Пример сущности:
@Entity
public class Order {
@Id
private Long id;
// Загружается сразу вместе с Order (EAGER)
@ManyToOne
private Customer customer;
// Загружается только при обращении к полю (LAZY)
@OneToMany(mappedBy = "order")
private List<Item> items = new ArrayList<>();
}
Почему такие настройки?
EAGERдля@ManyToOne: Обычно «многие» заказы ссылаются на одного клиента. Загрузка клиента сразу часто нужна и эффективна.LAZYдля@OneToMany: У одного заказа может быть много позиций. Их жадная загрузка может привести кN+1проблеме или избыточному объему данных. Ленивая загрузка позволяет загружать коллекцию только когда она действительно требуется.
Важно: Рекомендуется явно указывать FetchType.LAZY для всех ассоциаций, кроме критически необходимых, и использовать JOIN FETCH в запросах для контролируемой загрузки.