Что такое CascadeType в JPA и для чего он нужен?

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

Ответ

CascadeType в JPA определяет, какие операции жизненного цикла сущности должны автоматически распространяться (каскадироваться) на связанные сущности. Это позволяет управлять состоянием графа объектов без явного вызова операций для каждого связанного объекта.

Основные варианты CascadeType:

  • CascadeType.PERSIST – при сохранении родительской сущности сохраняются и все связанные сущности.
  • CascadeType.MERGE – при слиянии (обновлении) родительской сущности обновляются и все связанные сущности.
  • CascadeType.REMOVE – при удалении родительской сущности удаляются и все связанные сущности.
  • CascadeType.REFRESH и CascadeType.DETACH – распространяют операции refresh и detach.
  • CascadeType.ALL – включает все вышеперечисленные каскадные операции.

Практический пример:

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

    @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
    private List<Child> children = new ArrayList<>();
    // ...
}

В этом случае при вызове entityManager.persist(parent) будут автоматически сохранены все объекты Child из списка. Аналогично, при удалении parent будут удалены и все его children. Без указания каскада пришлось бы сохранять каждый Child отдельно.