Wie verwende ich das inverse Attribut? Wenn ich mich nicht irre, muss für eine bis viele Beziehungen das inverse Attribut auf true gesetzt werden. Für viele-zu-viele-Beziehungen muss eines der inversen Attribute der Entitätsklasse auf true und ein anderes auf false gesetzt werden.
Kann jemand Licht ins Dunkel bringen?
nhibernate
nhibernate-mapping
Graviton
quelle
quelle
Antworten:
Das inverse Attribut darf nicht auf true gesetzt werden ...
Sie verwenden das inverse Attribut, um den 'Eigentümer' der Zuordnung anzugeben. (Eine Zuordnung kann nur einen Eigentümer haben, daher muss ein Ende auf invers gesetzt werden, das andere muss auf "nicht invers" gesetzt werden.) (Besitzer:
inverse=false
; Nichteigentümer:inverse=true
)Wenn Sie in einer Eins-zu-Viele-Zuordnung die Sammlung nicht als inverses Ende markieren, führt NHibernate ein zusätzliches UPDATE durch. In diesem Fall fügt NHibernate zuerst die Entität ein, die in der Sammlung enthalten ist, und fügt bei Bedarf die Entität ein, der die Sammlung gehört, und aktualisiert anschließend die 'Sammlungsentität', sodass der Fremdschlüssel und die Zuordnung festgelegt werden gemacht wird. (Beachten Sie, dass dies auch bedeutet, dass der Fremdschlüssel in Ihrer Datenbank nullwertfähig sein sollte.)
Wenn Sie das Sammlungsende als "invers" markieren, behält NHibernate zuerst die Entität bei, die die Sammlung "besitzt", und behält anschließend die Entitäten bei, die sich anschließend in der Sammlung befinden, wobei eine zusätzliche UPDATE-Anweisung vermieden wird.
In einer bidirektionalen Assoziation haben Sie also immer ein umgekehrtes Ende.
quelle
Zusätzlich zu der obigen Antwort und nach meinem Verständnis müssen Sie den Fremdschlüsselwert in der Auflistung manuell beibehalten, wenn Sie die zusätzliche Aktualisierungsanweisung nicht möchten:
Weitere Erläuterungen zum inversen Attribut finden Sie im folgenden Beitrag:
http://www.emadashi.com/index.php/2008/08/nhibernate-inverse-attribute/
quelle
Ich kann sehen, wo der "Eigentümer" hereinkommt, aber eine Zuordnung ist eine Pipe, und Sie können nach unten schauen, also was soll ich sagen, welche Entität die Pipe "besitzt".
Eine andere Sichtweise ist, dass in einer Eins-zu-Viele-Beziehung tatsächlich zwei Beziehungen stattfinden.
Beziehung 1: Eltern vieler Kinder.
Beziehung 2: Jedes Kind zu einem Elternteil
Daher wird NH versuchen, SQL auszuführen, um diese in der Datenbank zu speichern. Dies ist jedoch nicht erforderlich, da beim Festlegen des Fremdschlüssels, z. B. in Beziehung 2, wenn ein Kind gespeichert wird, automatisch auch die Beziehung eines Elternteils zum Kind festgelegt wird, da Beziehung 1 die "Umkehrung" von Beziehung 2 ist .
Invers bedeutet also, dass es etwas ist, das wir standardmäßig erhalten, sobald wir die Hauptbeziehung festgelegt haben. Das heißt, es ist nicht erforderlich, dass NH SQL ausführt, um Beziehung 1 zu reparieren. Wenn Sie die untergeordnete Sammlung als inverse NH markieren, wird das Ausführen von SQL übersprungen, wenn die untergeordnete Sammlung hinzugefügt wird.
Ich würde annehmen, wenn Sie NH nicht sagen würden, dass es sich um eine Umkehrung handelt, würde es Mühe verschwenden, SQL zu verwenden, um zu versuchen, auch die Umkehrungsbeziehung herzustellen - obwohl dies nicht erforderlich war.
quelle