Fooは:
@ManyToMany(mappedBy = "foos")
private Set<Bar> bars
そしてバーは:
@ManyToMany
private Set<Foo> foos
テーブルがfoo_barと呼ばれるか、bar_fooと呼ばれるかを除いて、mappedBy属性の場所は双方向の関係にどのような違いをもたらしますか。 mappedBy属性がないと、foo_barとbar_fooの2つの結合テーブルが表示されます。
ドキュメント は言う:
関連付けが双方向の場合、片側が所有者で片側が逆の端でなければなりません(つまり、関連付けテーブルの関係値を更新するときに無視されます)。
したがって、mappedBy
属性を持つ側が逆側になります。 mappedBy
属性を持たない側が所有者です。
オーナー側は、Hibernateがどの関連が存在するかを知るために見る側です。したがって、たとえば、BarのfooのセットにFooを追加すると、Hibernateによって結合テーブルに新しい行が挿入されます。逆に、Fooのバーのセットにバーを追加しても、データベースでは何も変更されません。
mappedBy
は、関係のどちら側がリンクを「所有」しているかをHibernateに通知します。 OneToMany
またはOneToOne
でmappyedBy
を使用すると、リンクを格納するために使用される他のテーブルに外部キーがあることがHibernateに通知されます。
ManyToMany
に関しては、結合テーブルがあるため、どちらも他のオブジェクトへのリンクを直接持っていません。ただし、Hibernateは、「所有」側が操作のカスケード方法を知っていることを知る必要があります。