2009-08-24 3 views
1

Sorry, wenn dies eine Betrogene ist, konnte es nicht finden, aber nicht so recht wissen, was eigentlich zu suchen ...Kaskadierung in (N) Hibernate, welche Regeln brauche ich?

Ich habe drei Klassen, Parent, Child und Other

Parent hat viele Child wo Kind hat eine Parent_Id Spalte

Other einen Verweis durch eine Child_Id Spalte zu einer Child hält

Als ich Löschen Sie eine Parent, ich möchte auch alle damit verbundenen Child Objekte löschen. Wenn diese Child-Objekte durch eine beliebige Other Klassen referenziert werden, möchte ich ihre (die Other Objekte) Child_Id Referenzen aufgehoben werden.

Welche Kaskadenregeln brauche ich für die beiden Beziehungen?

Wird NHibernate auch Entitäten sowohl im Arbeitsspeicher als auch in der Datenbank aktualisieren?

I.e. Wenn ich eine Reihe von Parent, Child und Other im Speicher (d. h. geladen von db, nicht transient) und sagen NH zu einem Parent löschen, was passiert? Ich nehme an, die Objekte Parent und Child werden vorübergehend? Was passiert mit der Child Eigenschaft von Other Objekten?

Edit: bei Verwendung von All-Delete-Orphan, welche Klassen ein Objekt als ein Waisenkind? In dem obigen Beispiel ist eine Child eine Waise, wenn ihr Elternteil Parent gelöscht wird? Ist die Referenz von Other wichtig, wenn eine Entität als verwaist betrachtet wird?

Dank

Antwort

1

NH aktualisiert nicht alle Ihre Entitäten im Speicher (mit Ausnahme von Ids und Versionen). NH ist nicht dafür verantwortlich, die Beziehungen Ihrer Entitäten zu verwalten. Es bleibt nur bestehen, was Sie im Speicher für die Datenbank getan haben.

Von diesem Standpunkt aus sollte es leichter zu verstehen sein.

cascade="delete" bedeutet, dass das Kind gelöscht wird, wenn das übergeordnete Element gelöscht wird. cascade="delete-orphan" bedeutet, dass zusätzlich das Kind gelöscht wird, wenn kein Elternteil mehr darauf verweist. Dies funktioniert natürlich nur, wenn das Kind in der Sitzung ist.

Die gelöschte Instanz wird vorübergehend im Speicher abgelegt. Verweise auf die vorübergehende Instanz (von Other) verursachen eine Ausnahme. AFAIK, Sie müssen den Verweis auf gelöschte Instanzen selbst entfernen. Sie können es wahrscheinlich durch einige Tricks implizit machen, aber ich bezweifle, dass dies sauber sein wird. Es ist Geschäftslogik.

Für Eltern-Kind-Beziehungen ist cascade="all-delete-orphan" geeignet.

Als reguläre Referenz bevorzuge ich cascade="none".

Es gibt eine great explanation by Ayende Rahien

+0

Danke für die Aufklärung.Wenn ich eine Eins-zu-viele von "Child" zu "Other" hätte, könnte ich cascade auf save-update setzen und das würde mir die benötigte Funktionalität geben, richtig? außer ich möchte nicht die bidirektionale Beziehung haben, ich will nur in der Lage sein, von "Other" zu "Child" zu gehen, nicht umgekehrt. –

+0

Ich würde nicht speichern-aktualisieren Andere, weil Sie das Kind speichern. Unter der Annahme, dass "Andere" eine unabhängige Entität ist, die unabhängig vom untergeordneten Objekt erstellt und gelöscht wird, sollte sie nicht implizit durch Erstellen eines untergeordneten Objekts erstellt werden. Für mich ist das eine Art Best-Practice. Ich glaube nicht, dass das dein Problem lösen würde. Sie müssen den Verweis auf das Kind aus dem anderen trotzdem entfernen. Natürlich werden Sie die Referenzierung von Anderen leichter finden. –

+0

hmm nein du hast recht, ok fair genug. Also heißt das, dass ich alle 'Anderen' in den Speicher laden muss und dann ihre 'Kind'-Referenzen aufheben muss? scheint teuer: s –

Verwandte Themen