Was ist der Unterschied zwischen
@OneToMany(cascade=REMOVE, mappedBy="customer")
public List<Order> getOrders() { ... }
und
@OneToMany(mappedBy="customer", orphanRemoval="true")
public List<Order> getOrders() { ... }
Dieses Beispiel stammt aus dem Java EE Tutorial, aber ich verstehe immer noch keine Details.
java
jpa
cascading-deletes
rand0m86
quelle
quelle
Antworten:
Von hier aus : -
quelle
Ein einfacher Weg, um den Unterschied zwischen
CascadeType.REMOVE
und zu verstehenorphanRemoval=true
.Zum Entfernen von Waisen: Wenn Sie aufrufen
setOrders(null)
, werden die zugehörigenOrder
Entitäten automatisch in db entfernt.Zum Entfernen der Kaskade: Wenn Sie aufrufen
setOrders(null)
, werden die zugehörigenOrder
Entitäten NICHT automatisch in db entfernt.quelle
Angenommen, wir haben eine untergeordnete Entität und eine übergeordnete Entität. Ein Elternteil kann mehrere Kinder haben.
Die orphanRemoval ist ein ORM-Konzept, das angibt, ob das Kind verwaist ist. Es sollte auch aus der Datenbank entfernt werden.
Ein Kind ist verwaist, wenn es von seinem Elternteil nicht aufgerufen werden kann. Wenn wir beispielsweise den Personenobjektsatz entfernen (auf einen leeren Satz setzen) oder durch einen neuen Satz ersetzen, kann der Elternteil nicht mehr auf die Kinder im alten Satz zugreifen und die Kinder sind verwaist, sodass die Kinder zum Scheitern verurteilt sind auch in der Datenbank entfernt.
CascadeType.REMOVE ist ein Konzept auf Datenbankebene. Wenn das übergeordnete Element entfernt wird, sollten alle zugehörigen Datensätze in der untergeordneten Tabelle entfernt werden.
quelle
Praktisch liegt der Unterschied darin, ob Sie versuchen, die Daten zu aktualisieren (PATCH) oder die Daten vollständig zu ersetzen (PUT).
Angenommen, Sie löschen das
customer
als "Verwenden"cascade=REMOVE
, um Kundenbestellungen zu entfernen, die beabsichtigt und nützlich erscheinen.Nun lassen Sie uns sagen , dass Sie ein Update
customer
mitorphanRemoval="true"
es wird alle bisherigen Aufträge löschen und ersetzen Sie sie mit der einen zur Verfügung gestellt. (PUT
in Bezug aufREST API
)Ohne
orphanRemoval
alte Bestellungen würde gehalten werden. (PATCH
in Bezug aufREST API
)quelle
CascadeType.REMOVE
Die
CascadeType.REMOVE
Strategie, die Sie explizit konfigurieren können:oder erben Sie es implizit von der
CascadeType.ALL
Strategie:Mit dieser Option können Sie den
remove
Vorgang von der übergeordneten Entität auf die untergeordneten Entitäten übertragen.Wenn wir also die übergeordnete
Post
Entität zusammen mit ihrercomments
Sammlung abrufen und diepost
Entität entfernen :Hibernate führt drei Löschanweisungen aus:
Die
PostComment
untergeordneten Entitäten wurden aufgrund derCascadeType.REMOVE
Strategie gelöscht , die so tat, als hätten wir auch die untergeordneten Entitäten entfernt.Die Strategie zur Entfernung von Waisen
Die Strategie zum Entfernen von Waisen, die über das
orphanRemoval
Attribut festgelegt werden muss:Mit dieser Option können Sie die untergeordnete Tabellenzeile entfernen, wenn Sie die untergeordnete Entität aus der Sammlung entfernen.
Wenn wir also die
Post
Entität zusammen mit ihrercomments
Sammlung laden und die erstePostComment
aus dercomments
Sammlung entfernen :Hibernate führt eine DELETE-Anweisung für die zugehörige
post_comment
Tabellenzeile aus:Weitere Informationen zu diesem Thema finden Sie auch in diesem Artikel .
quelle