какая разница между
@OneToMany(cascade=REMOVE, mappedBy="customer")
public List<Order> getOrders() { ... }
и
@OneToMany(mappedBy="customer", orphanRemoval="true")
public List<Order> getOrders() { ... }
Этот пример взят из Руководства по Java EE, но я все еще не понимаю деталей.
java
jpa
cascading-deletes
rand0m86
источник
источник
Ответы:
От сюда : -
источник
Простой способ понять разницу между
CascadeType.REMOVE
иorphanRemoval=true
.Для удаления сирот: если вы вызываете
setOrders(null)
, связанныеOrder
объекты будут автоматически удалены в базе данных.Для удаления каскада: если вы вызываете
setOrders(null)
, связанныеOrder
объекты НЕ будут автоматически удалены из базы данных.источник
Предположим, у нас есть дочерняя и родительская сущности. У родителя может быть несколько детей.
OrphanRemoval - это концепция ORM, она сообщает, осиротел ли ребенок. его также следует удалить из базы данных.
Ребенок становится сиротой, когда к нему недоступен родитель. Например, если мы удалим набор объектов Person (установив для него пустой набор) или заменим его новым набором, то родительский элемент больше не сможет получить доступ к дочерним элементам в старом наборе, а дети станут сиротами, поэтому дети обречены на также удалены в базе данных.
CascadeType.REMOVE - это концепция уровня базы данных, которая сообщает, что если родительский элемент удален, все связанные с ним записи в дочерней таблице должны быть удалены.
источник
Фактически разница заключается в том, пытаетесь ли вы обновить данные (PATCH) или полностью заменить данные (PUT).
Допустим, вы удаляете те,
customer
использование которыхcascade=REMOVE
также удаляет те заказы клиентов, которые кажутся преднамеренными и полезными.Теперь предположим, что вы обновляете
customer
сorphanRemoval="true"
ней будут удалены все предыдущие заказы и заменить их в комплект поставки. (PUT
с точки зренияREST API
)Без
orphanRemoval
старых заказов сохранились бы. (PATCH
с точки зренияREST API
)источник
CascadeType.REMOVE
CascadeType.REMOVE
Стратегия, которую вы можете настроить в явном виде:или неявно унаследовать его от
CascadeType.ALL
стратегии:позволяет размножать
remove
операцию от родительской сущности на ее дочерние сущности.Итак, если мы получим родительский
Post
объект вместе с егоcomments
коллекцией и удалимpost
объект:Hibernate выполнит три оператора удаления:
В
PostComment
дочерних объектах были удалены из-заCascadeType.REMOVE
стратегии, которая действовала , как если бы мы убрали дочерние объекты , а также.Стратегия удаления сирот
Стратегия удаления сирот, которую необходимо установить с помощью
orphanRemoval
атрибута:позволяет удалить строку дочерней таблицы при удалении дочернего объекта из коллекции.
Итак, если мы загрузим
Post
сущность вместе с ееcomments
коллекцией и удалим первуюPostComment
изcomments
коллекции:Hibernate будет выполнять оператор DELETE для связанной
post_comment
строки таблицы:Для получения дополнительных сведений по этой теме ознакомьтесь также с этой статьей .
источник