Каскадные операции

Базовый Java
≈ 1 мин чтения

Cascade передаёт операцию связанным Entity

Иногда связанные объекты образуют единое целое с точки зрения жизненного цикла. Например, при сохранении нового заказа нужно одновременно сохранить созданные вместе с ним позиции. JPA позволяет явно указать, какие операции должны распространяться по связи.

@OneToMany(mappedBy = "order", cascade = CascadeType.PERSIST)
private List<OrderItem> items = new ArrayList<>();

Теперь persist(order) может распространить операцию PERSIST на элементы коллекции items. Без cascade связанные объекты не начинают автоматически участвовать в той же lifecycle-операции только потому, что на них есть ссылка.

Каскады выбираются по смыслу отношения

  • PERSIST — передать сохранение;
  • MERGE — передать merge;
  • REMOVE — передать удаление;
  • REFRESH и DETACH — передать соответствующие lifecycle-операции;
  • ALL — включить все перечисленные операции.
Не ставь CascadeType.ALL автоматически. Особенно внимательно относись к REMOVE: удаление одного объекта не всегда должно означать удаление связанного объекта, который используется где-то ещё.