Order と OrderLine があるとします。Order と OrderLine の間で一方向の OneToMany を持つように選択できます (Order には OrderLines のコレクションがあります)。または、OrderLine と Order の間の ManyToOne 関連付けを選択することもできます (OrderLine はその Order への参照を持ちます)。または、両方を選択することもできます。この場合、関連付けは双方向の OneToMany/ManyToOne 関連付けになります。
選択するソリューションは、主に状況と、エンティティ間の結合のレベルによって異なります。たとえば、ユーザー、会社、プロバイダーのすべてが多くのアドレスを持っている場合、それらすべてと Address の間に単方向を持ち、Address がその所有者を認識しないようにすることは理にかなっています。
User と Message があり、ユーザーが何千ものメッセージを持つことができる場合、Message から User への ManyToOne としてのみモデル化することは理にかなっています。とにかく、ユーザーのすべてのメッセージを要求することはほとんどないからです。ただし、JPQL クエリは関連付けをナビゲートすることでエンティティ間を結合するため、関連付けはクエリを支援するためにのみ双方向にすることができます。
双方向の関連付けでは、オブジェクトのグラフに一貫性がない状況になる可能性があります。たとえば、Order A には空の OrderLines のセットがありますが、一部の OrderLines には Order A への参照があります。JPA では常に、関連付けの一方の側が所有者側であり、もう一方の側が逆側であることが義務付けられています。逆側は JPA によって無視されます。所有者側は、どのような関係が存在するかを決定する側です。OneToMany 双方向アソシエーションでは、所有者側が多側である必要があります。したがって、前の例では、所有者側は OrderLine であり、行には A への参照があるため、JPA は行と注文 A の間の関連付けを保持します。
このような関連付けは、次のようにマッピングされます。
順番に :
@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;
OrderLine :
@ManyToOne
private Order parentOrder;