2013-04-20 16 views
25

Ich lese derzeit die Dokumentation von Hibernate in Bezug auf die entity associations und ich komme über eine kleine Schwierigkeit, einige Dinge herauszufinden. Es hat im Wesentlichen mit dem Unterschied zwischen ManyToOne und OneToMany Assoziationen zu tun. Obwohl ich sie in realen Projekten verwendet habe, kann ich den Unterschied zwischen ihnen nicht vollständig erfassen. Nach meinem Verständnis, wenn eine Tabelle/eine Entität eine ManyToOne Verknüpfung mit einer anderen hat, sollte die Verknüpfung von der anderen Seite OneToMany sein. Also, wie sollten wir entscheiden, welche basierend auf einem bestimmten Fall auszuwählen ist und wie sich dies auf die Datenbank/Abfragen/Ergebnisse auswirkt? Gibt es überall ein gutes Beispiel?Hibernate/JPA ManyToOne vs OneToMany

S.S .: Ich denke, es wäre aufgrund seiner Relevanz für die Frage hilfreich, wenn jemand nebenbei erklären könnte, was der Eigentümer des Vereins und der Unterschied zwischen bidirektionaler und unidirektionaler Assoziation ist.

Antwort

43

Angenommen, Sie haben einen Auftrag und eine OrderLine. Sie können wählen, ob Sie eine unidirektionale OneToMany zwischen Order und OrderLine haben möchten (Order würde eine Sammlung von OrderLines haben). Oder Sie können eine ManyToOne-Verknüpfung zwischen OrderLine und Order wählen (OrderLine würde einen Verweis auf seinen Auftrag haben). Oder Sie können beide auswählen. In diesem Fall wird die Verknüpfung zu einer bidirektionalen OneToMany/ManyToOne-Verknüpfung.

Die von Ihnen gewählte Lösung hängt hauptsächlich von der Situation und der Kopplung zwischen den Entitäten ab. Wenn beispielsweise ein Benutzer, eine Firma oder ein Provider viele Adressen haben, würde es Sinn machen, zwischen jeder von ihnen und der Adresse unidirektional zu sein, und Adresse nicht über ihren Besitzer wissen zu lassen.

Angenommen, Sie haben einen Benutzer und eine Nachricht, wo ein Benutzer Tausende von Nachrichten haben kann, könnte es sinnvoll sein, sie nur als ManyToOne von Nachricht an Benutzer zu modellieren, da Sie selten nach allen Nachrichten von a fragen werden Benutzer sowieso. Die Verknüpfung könnte jedoch nur bidirektional gemacht werden, um bei Abfragen zu helfen, da JPQL-Abfragen zwischen Entitäten durch Navigieren durch ihre Zuordnungen verknüpft werden.

In einer bidirektionalen Verknüpfung könnten Sie sich in einer Situation befinden, in der der Graph von Objekten inkonsistent ist. Beispiel: Order A würde einen leeren Satz OrderLines haben, aber einige OrderLines würden einen Verweis auf Order A haben. JPA schreibt vor, dass immer eine Seite der Assoziation die Ownerseite ist und die andere Seite die inverse Seite ist. Die inverse Seite wird von JPA ignoriert. Die Eigentümerseite ist die Seite, die entscheidet, welche Beziehung besteht. In einer OneToMany-bidirektionalen Assoziation muss die Ownerseite die Viele-Seite sein. Im vorherigen Beispiel wäre die Eigentümerseite OrderLine, und JPA würde die Zuordnung zwischen den Zeilen und der Reihenfolge A beibehalten, da die Zeilen eine Referenz auf A haben. Eine solche Zuordnung würde folgendermaßen zugeordnet:

in der Reihenfolge:

@OneToMany(mappedBy = "parentOrder") // mappedBy indicates that this side is the 
    // inverse side, and that the mapping is defined by the attribute parentOrder 
    // at the other side of the association. 
private Set<OrderLine> lines; 

in Orderline:

@ManyToOne 
private Order parentOrder; 
1

auch mit @ManytoOne Seite wie der Eigentümer nur erfordern würde n + 1 q Benutzer beim Speichern der Assoziationen. Wo ist n die Anzahl der Assoziationen (viele Seiten).

Während @OneToMany als Besitzer, beim Einfügen der übergeordneten Entität (eine Seite) mit Zuordnungen (viele Seite) würde in 2 * N + 1 Abfragen führen. Eine Abfrage wäre für die Einfügung der Assoziation und andere Abfrage wäre für das Aktualisieren des Fremdschlüssels in der assoziierten Entität.

Verwandte Themen