[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-kak-mappit-svyazi-mezhdu-sushchnostyami-v-chyom-raznitsa-mezhdu-lazy-i-eager-zagruzkoy":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":15,"progress":16,"seo":17},637,"kak-mappit-svyazi-mezhdu-sushchnostyami-v-chyom-raznitsa-mezhdu-lazy-i-eager-zagruzkoy",14,"spring","Spring","🌱","Как маппить связи между сущностями? В чём разница между LAZY и EAGER загрузкой?","JPA поддерживает четыре типа связей: `@ManyToOne`, `@OneToMany`, `@ManyToMany`, `@OneToOne`.\n\n### Значения по умолчанию (важно знать!)\n\n| Аннотация | FetchType по умолчанию |\n|-----------|------------------------|\n| `@ManyToOne` | EAGER (это плохо!) |\n| `@OneToOne` | EAGER (это плохо!) |\n| `@OneToMany` | LAZY (это хорошо) |\n| `@ManyToMany` | LAZY (это хорошо) |\n\nРекомендация: всегда явно указывайте `fetch = FetchType.LAZY` для всех связей.\n\n### @ManyToOne \u002F @OneToMany\n\n```java\n@Entity\npublic class Order {\n    @ManyToOne(fetch = FetchType.LAZY)\n    @JoinColumn(name = \"user_id\", nullable = false)\n    private User user;\n}\n\n@Entity\npublic class User {\n    @OneToMany(mappedBy = \"user\", cascade = CascadeType.ALL, orphanRemoval = true)\n    private List\u003COrder> orders = new ArrayList\u003C>();\n\n    public void addOrder(Order order) {\n        orders.add(order);\n        order.setUser(this);\n    }\n}\n```\n\n### LAZY vs EAGER\n\n| Тип | Когда загружается | Когда использовать |\n|-----|-------------------|--------------------|\n| LAZY | При первом обращении к коллекции\u002Fполю | По умолчанию для всех связей |\n| EAGER | Сразу вместе с родительской сущностью | Почти никогда |\n\n### CascadeType\n\n| CascadeType | Описание |\n|-------------|----------|\n| PERSIST | Каскадное сохранение |\n| MERGE | Каскадное обновление |\n| REMOVE | Каскадное удаление |\n| ALL | Все вышеперечисленные |\n\n> **На собеседовании:** ключевое -- знать значения FetchType по умолчанию и всегда ставить LAZY. Частая ошибка -- оставлять EAGER по умолчанию для `@ManyToOne` (причина проблемы N+1) или использовать `CascadeType.ALL` без необходимости.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":19,"keywords":20,"schemaAnswer":19,"featuredSnippetReady":21},"Как маппить связи между сущностями? В чём разница между LAZY — Gymterview","JPA поддерживает четыре типа связей: `@ManyToOne`, `@OneToMany`, `@ManyToMany`, `@OneToOne`.",[7,13],true]