2013-04-20 18 views
25

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

P .:私は、もし誰かが協会の所有者のポイントと双方向と一方向の関連の違いを説明することができれば、質問との関連性のために役立つだろうと思う。

答えて

43

注文と注文ラインがあるとします。 OrderとOrderLineの間に一方向のOneToManyを持たせることができます(OrderにはOrderLineのコレクションがあります)。あるいは、OrderLineとOrderの間にManyToOneアソシエーションを設定することもできます(OrderLineはそのOrderを参照します)。または、両方を持つことを選択できます。この場合、関連付けは双方向のOneToMany/ManyToOneの関連になります。

あなたが選択する解決策は、状況やエンティティ間の結合レベルによって大きく異なります。たとえば、ユーザー、会社、プロバイダーのすべてに多くのアドレスがある場合は、すべてのアドレスとアドレスの間に単方向性を持ち、アドレスに所有者のことを知らせないと意味があります。

ユーザーとメッセージがあるとします。ユーザーが何千ものメッセージを持つことができるとしたら、メッセージからユーザーへのManyToOneとしてのみモデル化するのは理にかなっています。とにかくユーザー。 JPQLクエリーは、関連付けをナビゲートすることでエンティティ間で結合するため、関連付けは双方向で行うこともできます。

双方向の関連付けでは、オブジェクトのグラフが矛盾していることがあります。たとえば、Order AにはOrderLinesの空のセットがありますが、OrderLinesの中にはOrder Aへの参照があります。JPAでは、所有者サイドであるアソシエーションの一方のサイドと、逆サイドである他方のサイドを常に持つようにしています。反対側はJPAによって無視されます。所有者側は、どのような関係が存在するかを決定する側です。 OneToMany双方向の関連付けでは、所有者側が多くの側でなければなりません。したがって、前の例では、所有者側はOrderLineとなり、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; 

:順序で

@ManyToOne 
private Order parentOrder; 
1

また、所有者のみが、N + 1のQを必要とするとして@ManytoOne側とを有しますアソシエーションを保存しながらここで、nは関連の数(多くの側)です。

所有者が@OneToManyであるのに対し、親エンティティ(片側)を関連付け(多側)で挿入すると2 * N + 1個のクエリになります。どの問合せにおいて、関連の挿入のためのクエリがあり、他のクエリは、関連するエンティティの外部キーを更新するためのものである。

関連する問題