2013-01-01 9 views
26

fooがあります@ManyToManyは(mappedBy = "foo" という)

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

とバーがあります。

@ManyToMany 
private Set<Foo> foos 
mappedByの場所は、双方向の関係を作る属性はどのような違い

、他tableがfoo_bar、bar_fooのいずれであるかよりも、 mappedBy属性がなければ、私はfoo_barとbar_fooの2つの結合テーブルを取得します。

+2

fooとbarは実際にはこれのための言葉の貧しい選択です。現実世界に存在する人間関係の具体例を考えてみてください。 – haventchecked

答えて

36

The documentationは言う:

関連が双方向である場合には、一方が所有者である必要があり、片方は逆の端(すなわちなければならない関連した関係値を更新するとき、それは無視されます。テーブル):

したがって、mappedBy属性を持つ側が反対側です。 mappedBy属性を持たない側が所有者です。

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

+0

DBを修正する必要があるバーが追加された場合、それらをお互いに反映させたいのですが? – NimChimpsky

+0

@NimChimpsky:双方向の関係で、Foo.barsを変更すると、それに応じてBar.foosも変更する必要があります。変更するときにDBに保存される内容に気を付ける必要はありません。 「所有権」の概念はデータベースの組織化に関するものであり、コードは完全にそれを知らないべきです。 –

+0

双方向の関連付けがあります:fooに棒を追加するときにも、fooを棒に追加します。 –

1

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

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

+1

-1:mappedByは、外部キーを持つテーブルを示しておらず、カスケードとは関係ありません。 –

関連する問題