В чем разница между 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 ответа:
С здесь: -
Каскадное Удаление
маркировка ссылочного поля с помощью 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
субъекты не удаляются в БД автоматически.