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;