[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-hibernate-kak-rabotaet-kaskadirovanie-cascadetype":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},1041,"kak-rabotaet-kaskadirovanie-cascadetype",19,"hibernate","Hibernate","🐻","Как работает каскадирование (CascadeType)?","Каскадирование определяет, какие операции с родительской сущностью автоматически распространяются на связанные (дочерние) сущности.\n\n> Аналогия из жизни: каскад — как удаление папки на диске. Удалили папку (родитель) — удалились все файлы внутри (дочерние). Но удаление файла из папки не удаляет саму папку.\n\n```java\n@Entity\npublic class Order {\n    @Id @GeneratedValue\n    private Long id;\n\n    @OneToMany(mappedBy = \"order\",\n               cascade = CascadeType.ALL,     \u002F\u002F каскад всех операций\n               orphanRemoval = true)           \u002F\u002F удалять «осиротевших» детей\n    private List\u003COrderItem> items = new ArrayList\u003C>();\n}\n```\n\n### Типы каскадирования\n\n| CascadeType | Операция | Описание |\n|-------------|----------|----------|\n| PERSIST | persist\u002Fsave | Новые дочерние сущности сохраняются вместе с родителем |\n| MERGE | merge | Detached дочерние сущности сливаются вместе с родителем |\n| REMOVE | remove\u002Fdelete | Дочерние сущности удаляются при удалении родителя |\n| REFRESH | refresh | Дочерние сущности перезагружаются из БД |\n| DETACH | detach | Дочерние сущности отсоединяются от Persistence Context |\n| ALL | все вышеперечисленные | Все операции каскадируются |\n\n### orphanRemoval\n\n`orphanRemoval = true` — удаляет дочернюю сущность при удалении из коллекции родителя:\n\n```java\n@Transactional\npublic void removeItem(Long orderId, Long itemId) {\n    Order order = orderRepository.findById(orderId).orElseThrow();\n    order.getItems().removeIf(item -> item.getId().equals(itemId));\n    \u002F\u002F orphanRemoval=true → Hibernate выполнит DELETE FROM order_items WHERE id = ?\n}\n```\n\n### Важное\n\n- `CascadeType.ALL` = PERSIST + MERGE + REMOVE + REFRESH + DETACH\n- orphanRemoval — удаляет дочернюю сущность, когда она убирается из коллекции родителя\n- Каскад распространяется только от родителя к ребёнку, не наоборот\n- Используйте каскад только для связей «родитель владеет ребёнком» (Order → OrderItem), не для ссылочных связей (Order → User)\n\n### Частые ошибки\n\n- `CascadeType.ALL` для `@ManyToOne` — удаление Order не должно удалять User; каскад здесь опасен\n- `CascadeType.REMOVE` без orphanRemoval — REMOVE срабатывает при `remove(order)`, но не при `order.getItems().remove(item)`\n- Каскад на ассоциациях с общими сущностями — если Department каскадно удаляет Users, удаление отдела удалит всех пользователей\n- orphanRemoval на `@ManyToMany` — концептуально бессмысленно; удаление из связи не должно удалять сущность\n\n### Как используется в 2026\n\n- `CascadeType.ALL + orphanRemoval` — стандарт для parent-child отношений (Order-OrderItem, Post-Comment)\n- Для слабых связей (User-Department) — каскад не используется\n- В DDD: каскад только внутри Aggregate Root → его Entity\n\n> **На собеседовании:** объясните разницу между CascadeType.REMOVE и orphanRemoval. REMOVE — при удалении родителя. orphanRemoval — при удалении из коллекции. Используйте CascadeType.ALL только для parent-child связей. Главная ошибка — каскад на `@ManyToOne` (удаление заказа удалит пользователя).","","middle",[15,16,17,7,18],"relationships","cascade","jpa","orphan-removal",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":35,"featuredSnippetReady":36},"Каскадирование (CascadeType) в Hibernate — Gymterview","CascadeType: PERSIST, MERGE, REMOVE, ALL. orphanRemoval для удаления «сирот». Каскад только для parent-child, не для ссылочных связей.","CascadeType и orphanRemoval: каскадные операции в Hibernate — Gymterview","Каскадирование распространяет операции от родителя к ребёнку. CascadeType.ALL + orphanRemoval для parent-child. Опасность каскада на @ManyToOne.",[27,28,29,30,31,32,33,8,34],"CascadeType","PERSIST","MERGE","REMOVE","ALL","orphanRemoval","каскадирование","JPA","Каскадирование распространяет операции с родительской сущности на дочерние. Типы: PERSIST, MERGE, REMOVE, REFRESH, DETACH, ALL. orphanRemoval=true удаляет дочернюю сущность при удалении из коллекции родителя. Каскад только от родителя к ребёнку. Используйте ALL+orphanRemoval для parent-child (Order→OrderItem). Никогда CascadeType.ALL для @ManyToOne.",true]