web-dev-qa-db-ja.com

@ManyToMany(mappedBy = "foo")

Fooは:

@ManyToMany(mappedBy = "foos")
private Set<Bar> bars

そしてバーは:

@ManyToMany
private Set<Foo> foos

テーブルがfoo_barと呼ばれるか、bar_fooと呼ばれるかを除いて、mappedBy属性の場所は双方向の関係にどのような違いをもたらしますか。 mappedBy属性がないと、foo_barとbar_fooの2つの結合テーブルが表示されます。

35
NimChimpsky

ドキュメント は言う:

関連付けが双方向の場合、片側が所有者で片側が逆の端でなければなりません(つまり、関連付けテーブルの関係値を更新するときに無視されます)。

したがって、mappedBy属性を持つ側が逆側になります。 mappedBy属性を持たない側が所有者です。

オーナー側は、Hibernateがどの関連が存在するかを知るために見る側です。したがって、たとえば、BarのfooのセットにFooを追加すると、Hibernateによって結合テーブルに新しい行が挿入されます。逆に、Fooのバーのセットにバーを追加しても、データベースでは何も変更されません。

44
JB Nizet

mappedByは、関係のどちら側がリンクを「所有」しているかをHibernateに通知します。 OneToManyまたはOneToOnemappyedByを使用すると、リンクを格納するために使用される他のテーブルに外部キーがあることがHibernateに通知されます。

ManyToManyに関しては、結合テーブルがあるため、どちらも他のオブジェクトへのリンクを直接持っていません。ただし、Hibernateは、「所有」側が操作のカスケード方法を知っていることを知る必要があります。

0
John Farrelly