Cascading in (N) Hibernate, welche Regeln benötige ich?
-
19-09-2019 - |
Frage
Sorry, wenn dies eine Betrogene ist, konnte es nicht finden, aber nicht so recht wissen, was zu suchen, trotzdem ...
Ich habe drei Klassen, Parent
, Child
und Other
Parent
hat viele Child
wo Kind eine Parent_Id
Spalte
Other
hält einen Verweis auf eine Child
durch eine Child_Id
Spalte
Wenn ich eine Parent
löschen, möchte ich auch alle zugehörigen Child
Objekte löschen. Wenn diese Child
Objekte, die von irgendwelchen Other
Klassen referenziert werden, möchte ich ihr (die Other
Objekte) Child_Id
Referenzen zunichte gemacht werden.
Was Kaskade Regeln muss ich auf die beiden Beziehungen?
Außerdem wird NHibernate Update Entitäten im Speicher sowie in der Datenbank?
d. wenn ich ein paar Parent
, Child
und Other
im Speicher haben (das heißt geladen von db, nicht transient) und NH erzählen eine Parent
zu löschen, was passieren wird? Ich gehe davon aus dem Parent
und Child
Objekte werden transiente werden? Was ist mit der Child
Eigenschaft aller Other
Objekte passieren?
Edit: bei der Verwendung von All-löschen-Waise, welche Klassen ein Objekt als Waise? In dem obigen Beispiel ist ein Child
eine Waise, wenn seine Eltern Parent
gelöscht wird? Hat die Referenz von Other
Angelegenheit, wenn ein Unternehmen als verwaiste Berücksichtigung?
Danke
Lösung
NH aktualisiert nicht alle Ihre Entitäten im Speicher (mit Ausnahme von Ids und Versionen). NH ist nicht verantwortlich, die die Beziehungen von Ihnen Einheiten zu verwalten. Es bleibt nur, was Sie in Erinnerung an die Datenbank haben.
Aus dieser Sicht sollte es leichter zu verstehen.
cascade="delete"
bedeutet, dass, wenn die Eltern gelöscht wird, wird das Kind als auch gelöscht.
cascade="delete-orphan"
bedeutet, dass zusätzlich wird das Kind, auch wenn kein Elternteil Referenzen es nicht mehr gelöscht. Dies funktioniert natürlich nur, wenn das Kind in der Sitzung ist.
Die gelöschte Instanz wird transient im Speicher. Bezugnahmen auf die vorübergehende Instanz (von Other
) wird eine Ausnahme verursachen. AFAIK, müssen Sie Bezug auf gelöschte Instanzen selbst entfernen. Sie wahrscheinlich kann es durch einige Tricks implizit machen, aber ich bezweifle, dass diese sauber sein wird. Es ist die Geschäftslogik.
Für Eltern-Kind-Beziehungen, cascade="all-delete-orphan"
angemessen ist.
Für die regelmäßigen Bezug ziehe ich cascade="none"
.
Es gibt eine große Erklärung von Ayende Rahien