Frage

Ich habe versucht, in dem Griff zu Hibernate inversem Attribute zu bekommen, und es scheint nur eines dieser Dinge, die vom Konzept her schwierig ist.

Der Kern, die ich erhalte, ist, dass, wenn Sie eine übergeordnete Einheit (zB Eltern), die eine Sammlung von Child-Objekten hat mit einem one-to-many Mapping, das Setzen von invers = true auf dem Kartierungs Hibernate sagt, dass ‚die andere Seite (das Kind) Verantwortung selbst zu aktualisieren, hat die Fremdschlüssel-Referenz in seiner Tabelle zu halten‘.

Dadurch erscheint das 2 Vorteile zu haben, wenn es darum geht, Kinder zu der Sammlung in Ihrem Code hinzufügen und dann das Speichern der Eltern (mit kaskaden aller Set):

Das scheint alles Sinn so weit zu machen. Was ich nicht bekommen, ist dies:? Wann möchten Sie nicht inverse verwenden möchten = true auf einer Eins-zu-viele-Beziehung

War es hilfreich?

Lösung

Wie Matthieu sagt, der einzige Fall, in dem Sie nicht invers festlegen möchten = true ist, wo es keinen Sinn für das Kind macht verantwortlich zu sein, sich für die Aktualisierung, wie in dem Fall, in dem das Kind keine Kenntnis hat von seine Eltern.

Wirft sie eine reale Welt versuchen, und schon gar nicht erfundenes Beispiel:

<class name="SpyMaster" table="SpyMaster" lazy="true">
  <id name="Id">
    <generator class="identity"/>
  </id>
  <property name="Name"/>
  <set name="Spies" table="Spy" cascade="save-update">
    <key column="SpyMasterId"/>
    <one-to-many class="Spy"/>
  </set>
</class>

<class name="Spy" table="Spy" lazy="true">
  <id name="Id">
    <generator class="identity"/>
  </id>
  <property name="Name"/>
</class>

Spymasters können Spione, aber Spione nie wissen, wer ihre spymaster ist, weil wir nicht die Viele-zu-Eins-Beziehung in der Spionage-Klasse aufgenommen haben. Auch (bequem) ein Spion kann Schelm drehen und so muss nicht mit einem spymaster verbunden sein. Wir können Objekte erstellen wie folgt:

var sm = new SpyMaster
{
    Name = "Head of Operation Treadstone"
};
sm.Spies.Add(new Spy
{
    Name = "Bourne",
    //SpyMaster = sm // Can't do this
});
session.Save(sm);

In einem solchen Fall würden Sie die FK Spalte NULL-Werte zulässt, weil der Akt des Sparens sm in die Spymaster Tabelle einfügen würde und der Spy-Tabelle und erst danach würde es dann die Spy-Tabelle aktualisieren, um die FK einzustellen. In diesem Fall, wenn wir umgekehrt setzen waren = true, würde der FK aktualisiert nie bekommen.

Andere Tipps

Trotz des Hoch gestimmt akzeptierte Antwort, habe ich eine andere Antwort.

Betrachten wir ein Klassendiagramm mit diesen Beziehungen:

Parent => list of Items
Item => Parent

Nobody immer , sagte, dass das Item => Eltern bezogen auf die Parent => Produkte Beziehung redundant ist. Ein Element kann alle Eltern verweisen.

Aber in Ihrer Anwendung, Sie wissen, dass die Beziehungen sind redundant . Sie wissen, dass die Beziehungen müssen nicht separat in der Datenbank gespeichert werden. So entscheiden Sie es in einer einzigen Fremdschlüssel zu speichern , zeigt der Artikel auf die Eltern. Diese minimalen Informationen genügen, um die Liste aufzubauen und die Referenz zurück.

Alles, was Sie tun müssen, um diese mit NH zuzuordnen ist:

  • verwendet den gleichen Fremdschlüssel für beiden Beziehungen
  • NH sagen, dass eine (die Liste) zum anderen ist überflüssig und könnte ignoriert werden, wenn das Objekt zu speichern. (Das ist, was NH tut eigentlich mit inverse="true")

Das sind die Gedanken, die für inverse relevant sind. Nichts anderes. Es ist keine Wahl, es gibt nur eine Möglichkeit, korrekte Abbildung ist.


Der Spion Problem : Es ist eine ganz andere Diskussion , wenn Sie eine Referenz aus dem Artikel an die Eltern unterstützen wollen. Dies ist bis zu Ihrem Geschäftsmodell, NH nimmt keine Entscheidungen in diesen. Wenn eine der Beziehungen fehlt, gibt es natürlich keine Redundanz und keine Verwendung von invers.

Missbrauch: Wenn Sie inverse = „true“ auf einer Liste verwenden, die keine Redundanz im Speicher haben, es funktioniert einfach nicht gespeichert. Wenn Sie nicht über die inversen angeben = „true“, wenn es da sein soll, kann NH speichert die redundante Information zweimal.

Wenn Sie eine unidirektionale Assoziation haben wollen heißt, dass die Kinder auf die Eltern nicht navigieren können. Wenn ja, sollten Sie FK Spalt NULLABLE sein, weil die Kinder vor dem Mutter gespeichert werden.

scroll top