Что такое каскадирование (Cascading) в JPA/Hibernate?

«Что такое каскадирование (Cascading) в JPA/Hibernate?» — вопрос из категории Hibernate, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Каскадирование — это механизм в JPA/Hibernate, который автоматически распространяет операции (persist, merge, remove и др.) с родительской сущности на связанные с ней дочерние сущности. Это позволяет упростить управление жизненным циклом связанных объектов.

Основные типы каскадирования (CascadeType):

  • PERSIST – сохранение родителя приводит к сохранению дочерних объектов.
  • MERGE – обновление родителя приводит к обновлению дочерних объектов.
  • REMOVE – удаление родителя приводит к удалению дочерних объектов.
  • ALL – все вышеперечисленные операции.
  • REFRESH / DETACH – менее используемые операции обновления состояния и отсоединения.

Почему это важно: Без каскадирования разработчик должен вручную управлять состоянием каждого связанного объекта, что увеличивает объем кода и риск ошибок.

Пример с аннотацией @OneToMany:

@Entity
public class Parent {
    @Id
    private Long id;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Child> children = new ArrayList<>();
    // ...
}

При вызове entityManager.persist(parent) все объекты в коллекции children также будут сохранены. Параметр orphanRemoval = true обеспечивает автоматическое удаление дочерней сущности из БД при её удалении из коллекции.