В чем разница между cascade и orphan removal from DB?


в чем разница между

@OneToMany(cascade=REMOVE, mappedBy="customer")
public List<Order> getOrders() { ... }

и

@OneToMany(mappedBy="customer", orphanRemoval="true")
public List<Order> getOrders() { ... }

этот пример из учебника Java EE, но я все еще не понимаю деталей.

2 57

2 ответа:

С здесь: -

Каскадное Удаление

маркировка ссылочного поля с помощью CascadeType.Удалить (или CascadeType.ВСЕ, который включает в себя REMOVE) указывает, что операции удаления должны быть автоматически передаются объекты, на которые ссылаются, что поле (на несколько объектов сущности может ссылаться коллекция поле):

@Entity
class Employee {
     :
    @OneToOne(cascade=CascadeType.REMOVE)
    private Address address;
     :
}

Удаления Сирота

JPA 2 поддерживает дополнительный и более агрессивный режим удаления каскадирования который можно указать с помощью элемента orphanRemoval @OneToOne и @ OneToMany аннотации:

@Entity
class Employee {
     :
    @OneToOne(orphanRemoval=true)
    private Address address;
     :
}

разница:-

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

  • если orphanRemoval=true указывается, что отключенный экземпляр адреса автоматически удаляется. Это полезно для очистки зависимые объекты (например, адрес), которые не должны существовать без ссылка от объекта-владельца (например, сотрудника).
  • если только cascade=CascadeType.Удалить указано, что автоматическое действие не выполняется, так как отключение отношения не является удалением
    операция.

простой способ понять разницу между CascadeType.REMOVE и orphanRemoval=true.

для удаления сирота : Если вы вызываете setOrders(null), связанные с Order объекты будут удалены в БД автоматически.

для удаления каскада: Если вы вызываете setOrders(null), связанные с Order субъекты не удаляются в БД автоматически.