2016-05-15 9 views
5
  1. MappedByを双方向の多対多リレーションシップに設定する理由は何ですか?
  2. あるテーブルには大量のレコードがあり、他のテーブルにはいくつかあるが、mappedByを置く方が良いでしょうか?

答えて

1

mappedByは、双方向関係の両側をリンクします。レコードの数に基づいてではなく、関係の所有者にmappedByを置きます(別名オブジェクト指向設計)。 JPAのチュートリアルとドキュメンテーションでこの情報を見つけることができます。

+0

documentationでは、mappedByをどこに置くかに違いはないと言います。つまり、私はオーナーとして誰かを選ぶことができます。私はmany-to-manyでmappedByが必要な理由を明確に理解していません。多対1 /多対多の場合は明らかです。私は生産性に疑わしい影響を与えている、それは私の質問の2番目の部分の理由です。 – Dmitry

+0

私が言ったように、BIDIRECTIONALの関係が必要です。 1-N、1-1、M-Nはその質問には無関係です。 OWNERを定義する側はどちらですか? JPAの仕様 –

+0

を参照してください。実際には、関係の逆の側に 'mappedBy'を入れます。 – Jack

8

実際には良い質問です。「所有する」エンティティの概念を理解するのに役立ちます。両方向(双方向の関係にある)がjoin tablesであるのを防ぐには、良い考えです。一方の側にmappedBy=要素が必要です。

join tableがあるかどうかは、@ManyToManyアノテーションのmappedBy="name"要素によって制御されます。 The Javadoc for mappedBy for the ManyToMany annotation says

この関係を所有するフィールド。関係が一方向でない場合は必須です。あなたの(双方向)例えば

、2つだけ @ManyToMany注釈なし mappedBy=要素があった場合、デフォルトは2つの Entityのテーブルと2 Join Tablesがあります:これはと言っている間に

Hibernate: create table SideA (id bigint not null, primary key (id)) 
Hibernate: create table SideA_SideB (sidea_id bigint not null, sidebs_id bigint not null, primary key (sidea_id, sidebs_id)) 
Hibernate: create table SideB (id bigint not null, primary key (id)) 
Hibernate: create table SideB_SideA (sideb_id bigint not null, sideas_id bigint not null, primary key (sideb_id, sideas_id)) 

を各エンティティManyToManyの関係を「所有」している場合は、通常のユースケースではjoin tableが冗長で、JavadocはmappedBy注釈が必要だと言います。 SideBのエンティティが、もはやそのManyToMany関係を所有しているので

@Entity 
public class SideA { 
    @ManyToMany 
    Set<SideB> sidebs; 
} 
@Entity 
public class SideB { 
    @ManyToMany(mappedBy="sidebs") 
    Set<SideA> sideas; 
} 

:私はSideAの「自分」の関係を持ってすることを決めたならば、私はそれは関係を所有していないいないことを指定するには、SideBのエンティティにmappedBy=要素を追加します、余分なJoinTableは作成されません。

Hibernate: create table SideA (id bigint not null, primary key (id)) 
Hibernate: create table SideB (id bigint not null, primary key (id)) 
Hibernate: create table SideA_SideB (sideas_id bigint not null, sidebs_id bigint not null, primary key (sideas_id, sidebs_id)) 

彼または彼女はそれがこの場合SideAエンティティには、所有するエンティティに追加されますしない限り、何の関係が永続化されていないことを理解しなければならないので、これは開発者にとって重要です。ただし、これは双方向の関係であるため、開発者はSideAからSideB.sideasSideBからSideA.sidebsとの両方を追加する必要があります。

あなたが関与両方のエンティティにManyToManyを持っていることを意味しbidirectionalManyToMany関係を持っているのであれば、あなたはJavadocのあたりとしてそれらのいずれかにmappedBy="name"を追加する必要があり、冗長join tableを避けるために。双方向であるため、どちらの側でもエンティティを作成することは重要ではないと思います。これはアプリケーションの設定に依存します。

参考文献:

What is the difference between Unidirectional and Bidirectional associations?をいつものように、それはSQLのログを有効にして、データベース内で何が起こっているかを確認するために、常に良い考えです。

What does relationship owner means in bidirectional relationship?

What is the “owning side” in an ORM mapping?

Most efficient way to prevent an infinite recursion in toString()?

+0

興味深いことに、Playのebean 4.0.2! 2.6では、いずれの側にもmappedByがなくても1つのテーブルしか作成されません – Luke

関連する問題