Załóżmy, że masz zamówienie i zamówienie. Możesz zdecydować się na jednokierunkową OneToMany pomiędzy Kolejność i Linia zamówienia (Zamówienie będzie mieć kolekcję Linii zamówienia). Możesz też wybrać powiązanie ManyToOne między linią zamówienia i zamówieniem (OrderLine będzie mieć odniesienie do jego zamówienia). Możesz też wybrać oba, w którym to przypadku skojarzenie staje się dwukierunkowym skojarzeniem OneToMany/ManyToOne.
Wybrane rozwiązanie zależy głównie od sytuacji i poziomu powiązań między podmiotami. Na przykład, jeśli użytkownik, firma lub dostawca mają wiele adresów, sensownym byłoby posiadanie jednokierunkowego połączenia między każdym z nich a adresem, a adres nie będzie wiedział o ich właścicielu.
Załóżmy, że masz użytkownika i wiadomość, w której użytkownik może mieć tysiące wiadomości, to może mieć sens modelowanie go tylko jako ManyToOne z wiadomości dla użytkownika, ponieważ rzadko będziesz prosić o wszystkie wiadomości i tak użytkownik. Powiązanie może być dwukierunkowe tylko po to, aby pomóc w wyszukiwaniu zapytań, ponieważ kwerendy JPQL łączą się między elementami, przeglądając ich powiązania.
W powiązaniu dwukierunkowym można znajdować się w sytuacji, w której wykres obiektów jest niespójny. Na przykład, Zamówienie A miałoby pusty zestaw Linii Rozkazów, ale niektóre Linie Zamówień miałyby odniesienie do Zamówienia A. JPA narzuca, że zawsze jedna strona asocjacji jest stroną właściciela, a druga strona jest stroną odwrotną. Odwrotna strona jest ignorowana przez JPA. Strona właściciela jest stroną, która decyduje, jaka relacja istnieje. W dwukierunkowym asocjacji OneToMany strona właściciela musi być po drugiej stronie. Tak więc w poprzednim przykładzie stroną właściciela byłaby OrderLine, a JPA zachowałoby powiązanie między wierszami a rzędem A, ponieważ linie mają odniesienie do A.
Takie skojarzenie będzie odwzorowane w następujący sposób:
kolejno:
@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;
w ORDERLINE:
@ManyToOne
private Order parentOrder;