65

現在、エンティティの関連付けに関するHibernateのドキュメントを読んでいますが、いくつかのことを理解するのが少し難しいです。それは本質的に と の関連性の違いManyToOneOneToMany関係があります。私は実際のプロジェクトでそれらを使用しましたが、それらの違いを完全に理解することはできません. 私の理解では、テーブル/エンティティがManyToOne別のエンティティと関連付けられている場合、その関連付けは反対側からのものである必要がありますOneToMany。では、特定のケースに基づいてどちらを選択するかをどのように決定する必要があり、それがデータベース/クエリ/結果にどのように影響するのでしょうか? 良い例はどこにでもありますか?

PS:関連付けの所有者のポイントと、双方向関連付けと単方向関連付けの違いを誰かが説明できれば、質問との関連性のために役立つと思います。

4

4 に答える 4

80

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;
于 2013-04-20T11:19:16.387 に答える