JPA 2.0 orphanRemoval = True VS beim Löschen von Cascade
Ich bin ein wenig verwirrt über die JPA 2.0 orphanRemoval
Attribut.
Ich denke, ich kann sehen, sein ist notwendig, wenn ich meine JPA-provider die DB-generation-tools zum erstellen des zugrunde liegenden Datenbank-DDL-eine ON DELETE CASCADE
auf die Besondere Beziehung.
Jedoch, ob der in der DB vorhanden ist und es bereits eine ON DELETE CASCADE
auf das Verhältnis, ist dies nicht genug, um die Kaskade der Löschung angemessen ist? Was bedeutet die orphanRemoval
tun zusätzlich?
Cheers
InformationsquelleAutor der Frage Markos Fragkakis | 2010-12-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
orphanRemoval
hat nichts zu tun mitON DELETE CASCADE
.orphanRemoval
ist eine ganz ORM-spezifische Sache. Es markiert "Kind" eine Person entfernt werden, wenn es nicht mehr referenziert wird von der "übergeordneten" Entität, z.B. beim entfernen der untergeordneten Entität aus der entsprechenden Auflistung der übergeordneten Entität.ON DELETE CASCADE
ist ein Datenbank-spezifische Sachees löscht das "Kind" Zeile in der Datenbank, wenn die "Eltern" - Zeile gelöscht.InformationsquelleAutor der Antwort axtavt
Ein Beispiel genommen bilden hier:
Wenn ein
Employee
entity-Objekt wird entfernt, die entfernen-operation überlappend auf die verwiesen wirdAddress
entity-Objekt. In diesem ZusammenhangorphanRemoval=true
undcascade=CascadeType.REMOVE
identisch sind, und wennorphanRemoval=true
angegeben ist,CascadeType.REMOVE
redundant ist.Den Unterschied zwischen den beiden Einstellungen ist in der Antwort zu trennen, eine Beziehung. Zum Beispiel, wie bei der Einstellung der Adresse Feld
null
oder zu einem anderenAddress
Objekt.Wenn
orphanRemoval=true
angegeben ist, die getrenntAddress
Instanzwird automatisch entfernt. Dies ist nützlich für die Reinigung abhängig
Objekte (z.B.
Address
), die es nicht geben dürfte, ohne einen Verweis ausein Eigentümer Objekt (z.B.
Employee
).Wenn nur
cascade=CascadeType.REMOVE
angegeben ist, wird keine automatische Aktionist geboten, da das trennen einer Beziehung nicht entfernen
Betrieb.
Zu vermeiden, hängende Referenzen als Folge von orphan entfernen, wird diese Funktion sollte nur aktiviert werden, für Felder, halten die privaten, nicht freigegebenen abhängigen Objekte.
Ich hoffe das macht es klarer.
InformationsquelleAutor der Antwort forhas
Moment entfernen Sie ein child-Objekt aus der Auflistung werden Sie auch entfernen, dass die untergeordneten Entitäten aus der DB als gut. orphanRemoval bedeutet auch, dass Sie nicht ändern können den Eltern; wenn es eine Abteilung, die Mitarbeiter, sobald Sie zu entfernen, dass Mitarbeiter, um es in ein anderes Sachgebiet, haben Sie versehentlich entfernt, die Mitarbeiter von der DB bei flush/commit(whichver kommt zuerst). Die Moral zu setzen, orphanRemoval auf true, so lange, wie Sie sicher sind, dass die Kinder, die Eltern nicht zu migrieren, um ein anderes Elternteil während Ihrer gesamten Existenz. Einschalten orphanRemoval auch fügt automatisch ENTFERNEN zu cascade-Liste.
InformationsquelleAutor der Antwort Onur
Den Gegenwert JPA-mapping für die DDL -
ON DELETE CASCADE
istcascade=CascadeType.REMOVE
. Orphan removal bedeutet, dass abhängige Entitäten werden entfernt, wenn die Beziehung zu Ihren "Eltern" - Entität ist zerstört. Zum Beispiel, wenn ein Kind entfernt wird, ein@OneToMany
Beziehung ohne explizit das entfernen es in den entity-manager.InformationsquelleAutor der Antwort Heri
@GaryK Antwort ist absolut toll, ich habe eine Stunde auf der Suche nach einer Erklärung für die
orphanRemoval = true
vsCascadeType.REMOVE
und es half mir zu verstehen.Fazit:
orphanRemoval = true
funktioniert identisch wieCascadeType.REMOVE
NUR, WENN wir löschen Objekt (entityManager.delete(object)
) und wir wollen, dass die Kinder Objekte auch entfernt werden.In ganz anderen sitiuation, wenn wir das abrufen einiger Daten wie
List<Child> childs = object.getChilds()
entfernen und dann ein Kind (entityManager.remove(childs.get(0)
) mitorphanRemoval=true
wird verursachen, dass die Person entsprechendchilds.get(0)
werden gelöscht aus der Datenbank.InformationsquelleAutor der Antwort pzeszko
orphan removal hat die gleiche Wirkung wie ON DELETE CASCADE in das folgende Szenario:-
Können sagen, wir haben einfach viele zu-eins-Beziehung zwischen der Entität student und ein Führer Stelle, wo viele Schüler zugeordnet werden können und die gleiche Anleitung und in der Datenbank haben wir eine foreign key-Beziehung zwischen Student und Anleitung Tabelle student Tisch hat id_guide als FK.
//Der übergeordneten Entität
In diesem Szenario die Beziehung ist derart, dass ein student-entity ist Inhaber der Beziehung und als solche müssen wir sparen, das student-entity, um zu bestehen, die das ganze Objekt graph z.B.
Sind wir hier die Zuweisung des gleichen Anleitung mit zwei verschiedenen Schüler-Objekte und da die KASKADE.PERSIST verwendet wird , wird das graph-Objekt gespeichert werden, wie unten in der Datenbank-Tabelle(MySql in meinem Fall)
SCHÜLER Tabelle:-
ID, Name, Dept Id_Guide
1 Roy ECE 1
2 Nick ECE 1
HANDBUCH Tabelle:-
ID NAME Salary
1 John $1500
und wenn ich heute entfernen möchten einer der Studenten, mit
und wenn ein Schüler Datensatz entfernt und die entsprechende Anleitung Datensatz sollte auch entfernt werden, das ist, wo die KASKADE.ENTFERNEN Sie das Attribut in der Entität Student kommt ins Bild und was es nicht ist ;es beseitigt die Schüler mit der id 1 als auch der entsprechenden Anleitung-Objekt(id 1). Aber in diesem Beispiel, es gibt noch eine student-Objekt zugeordnet ist, den gleichen guide aufnehmen und es sei denn, wir verwenden die orphanRemoval=true Attribut in der Führung Einheit , das entfernen der code oben wird nicht funktionieren.
InformationsquelleAutor der Antwort kunal
Der Unterschied ist:
- orphanRemoval = true: "Kind" eine Person wird entfernt wenn es nicht mehr referenziert wird (seine Eltern können nicht entfernt werden).
- CascadeType.ENTFERNEN Sie: "Kind" eine Person wird erst entfernt, wenn seine "Eltern" entfernt.
InformationsquelleAutor der Antwort user3572554