[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-hibernate-chto-takoe-fetchtype-lazy-i-fetchtype-eager":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":19,"progress":20,"seo":21},755,"chto-takoe-fetchtype-lazy-i-fetchtype-eager",19,"hibernate","Hibernate","🐻","Что такое FetchType.LAZY и FetchType.EAGER?","FetchType определяет, когда Hibernate загружает связанные сущности из БД. EAGER загружает сразу вместе с основной сущностью, LAZY — только при первом обращении.\n\n### Поведение\n\n```java\n\u002F\u002F EAGER — загрузка сразу\n@ManyToOne(fetch = FetchType.EAGER)\nprivate Department department;\n\u002F\u002F При загрузке User → сразу загружается Department\n\n\u002F\u002F LAZY — загрузка по требованию\n@ManyToOne(fetch = FetchType.LAZY)\nprivate Department department;\n\u002F\u002F При загрузке User → department НЕ загружается\n\u002F\u002F department загрузится при вызове user.getDepartment().getName()\n```\n\n### Значения по умолчанию\n\n| Тип связи | FetchType по умолчанию |\n|-----------|----------------------|\n| `@ManyToOne` | EAGER |\n| `@OneToOne` | EAGER |\n| `@OneToMany` | LAZY |\n| `@ManyToMany` | LAZY |\n\n### Как LAZY работает технически\n\nHibernate подставляет вместо реальной сущности прокси-объект (наследник сущности, сгенерированный через Byte Buddy). При первом вызове метода прокси выполняет SQL-запрос:\n\n```java\nUser user = session.find(User.class, 1L);\n\u002F\u002F user.department — это прокси (не настоящий Department)\n\nString deptName = user.getDepartment().getName();\n\u002F\u002F ↑ Здесь прокси выполняет SQL: SELECT * FROM departments WHERE id = ?\n```\n\n### Важное\n\n- Всегда явно указывайте `FetchType.LAZY` для `@ManyToOne` и `@OneToOne` (по умолчанию EAGER!)\n- LAZY — это подсказка, не требование; Hibernate может загрузить eager при необходимости\n- LAZY работает через прокси-объекты — вызов метода на прокси инициирует SQL-запрос\n- LAZY требует открытой Session — обращение к прокси после закрытия Session → LazyInitializationException\n\n### Частые ошибки\n\n- Оставлять `@ManyToOne` без явного `fetch = LAZY` — по умолчанию EAGER, загрузка всех связей каскадно\n- EAGER для коллекций — загрузка `List\u003COrder>` при каждом чтении User — катастрофа для производительности\n- Множественные EAGER-коллекции — Hibernate не может выполнить один запрос для двух EAGER-коллекций; получается Cartesian product или MultipleBagFetchException\n- Проверка `== null` для LAZY-прокси — прокси никогда не null (даже если записи в БД нет); используйте `Hibernate.isInitialized()`\n\n### Как используется в 2026\n\n- Правило: всё LAZY, загружать через JOIN FETCH или EntityGraph по необходимости\n- Spring Boot `spring.jpa.open-in-view=false` — отключение OSIV заставляет явно загружать данные в сервисном слое\n- Hibernate 6 bytecode enhancement — позволяет LAZY для `@Basic` полей (не загружать тяжёлые BLOB\u002FCLOB до обращения)\n\n> **На собеседовании:** правило номер один — всё LAZY. Покажите, что знаете дефолты: `@ManyToOne` и `@OneToOne` по умолчанию EAGER. Объясните, как работает прокси и что произойдёт при обращении к LAZY-связи после закрытия Session. Упомяните JOIN FETCH как основной способ загрузки нужных данных.","","junior",[15,16,17,18,7],"performance","lazy-loading","fetch","jpa",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":35,"featuredSnippetReady":36},"FetchType.LAZY и FetchType.EAGER в Hibernate — Gymterview","LAZY загружает связь по требованию через прокси, EAGER — сразу. Дефолты: @ManyToOne EAGER, @OneToMany LAZY. Правило: всегда LAZY + JOIN FETCH.","LAZY vs EAGER загрузка в Hibernate: прокси, дефолты и подводные камни — Gymterview","Как работает LAZY через прокси-объекты, почему @ManyToOne по умолчанию EAGER и почему это проблема. Правило: всё LAZY + JOIN FETCH.",[27,28,29,30,31,32,33,8,34],"FetchType","LAZY","EAGER","прокси","Byte Buddy","LazyInitializationException","JOIN FETCH","JPA","FetchType определяет момент загрузки связанных сущностей. EAGER — сразу с основной сущностью. LAZY — при первом обращении через прокси-объект. Дефолты: @ManyToOne и @OneToOne — EAGER, @OneToMany и @ManyToMany — LAZY. Правило: всегда явно указывать LAZY, загружать нужные данные через JOIN FETCH или @EntityGraph. LAZY требует открытой Session.",true]