- MappedByを双方向の多対多リレーションシップに設定する理由は何ですか?
- あるテーブルには大量のレコードがあり、他のテーブルにはいくつかあるが、mappedByを置く方が良いでしょうか?
答えて
mappedBy
は、双方向関係の両側をリンクします。レコードの数に基づいてではなく、関係の所有者にmappedBy
を置きます(別名オブジェクト指向設計)。 JPAのチュートリアルとドキュメンテーションでこの情報を見つけることができます。
実際には良い質問です。「所有する」エンティティの概念を理解するのに役立ちます。両方向(双方向の関係にある)が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.sideas
とSideB
からSideA.sidebs
との両方を追加する必要があります。
あなたが関与両方のエンティティにManyToMany
を持っていることを意味しbidirectional
ManyToMany
関係を持っているのであれば、あなたは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()?。
興味深いことに、Playのebean 4.0.2! 2.6では、いずれの側にもmappedByがなくても1つのテーブルしか作成されません – Luke
- 1. ManyToMany双方向
- 2. ManyToMany双方向のEntityForm
- 3. JPA ManyToMany双方向インサート
- 4. ASP.NETで双方向(双方向)データバインディングとは何ですか?
- 5. Hibernate mappedBy and ManyToMany
- 6. NHibernateコンポジットidマッピングの問題、双方向/単方向OneToMany、ManyToOne、ManyToMany
- 7. 双方向ビジネスルールとは何ですか?
- 8. 双方向のhibernate - org.hibernate.AnnotationException:未知のmappedBy in:エラー
- 9. @ManyToManyは(mappedBy = "foo" という)
- 10. Liquibase初心者:ManyToMany関連を双方向にする
- 11. 双方向データバインディングと反応性の違いは何ですか?
- 12. Hibernateは@ManyToMany双方向関係で無限ループを引き起こします
- 13. 双方向ハッシュアルゴリズムですか?
- 14. @ ManyToMany/@ OneToMany bidirectionalアソシエーション用のmappedby属性
- 15. 双方向データバインディング - ngModel
- 16. TCPキープアライブは双方向ですか?
- 17. 双方向バインド
- 18. 双方向はWPF
- 19. 双方向バブルソートプルーフ
- 20. オブジェクト指向のCRUDプログラム - オブジェクト指向設計の理由は何ですか?
- 21. C++「双方向」オブザーバーパターン
- 22. 双方向バインディングAngularjsのバグ
- 23. 双方向カスケード
- 24. 双方向アソシエーション
- 25. 双方向マッピングリスト
- 26. 双方向リスト
- 27. clojureの双方向マップですか?
- 28. Javaの双方向マップですか?
- 29. リサイクルビューのAndroid双方向ビューですか?
- 30. WPF CheckBoxの双方向は
documentationでは、mappedByをどこに置くかに違いはないと言います。つまり、私はオーナーとして誰かを選ぶことができます。私はmany-to-manyでmappedByが必要な理由を明確に理解していません。多対1 /多対多の場合は明らかです。私は生産性に疑わしい影響を与えている、それは私の質問の2番目の部分の理由です。 – Dmitry
私が言ったように、BIDIRECTIONALの関係が必要です。 1-N、1-1、M-Nはその質問には無関係です。 OWNERを定義する側はどちらですか? JPAの仕様 –
を参照してください。実際には、関係の逆の側に 'mappedBy'を入れます。 – Jack