@JoinTable は @ManyToMany 関係の両側に指定する必要がありますか? 質問する

@JoinTable は @ManyToMany 関係の両側に指定する必要がありますか? 質問する

エンティティCourseとエンティティがありUserます。多対多コースとユーザーの関係。コースには多くのユーザーがいて、ユーザーは多くのコースに登録できるためです。両方のエンティティで、@ManyToMany特定のフィールドに注釈を付けました。つまり、次のCourseようになります。

@ManyToMany
private List<RegisteredUser> members;

そしてUser私は持っています:

@ManyToMany
private List<Course> coursesTaken;

さて、このような多対多の関係は、通常、3 番目のテーブルで表されます。また、@JoinTableそれを可能にする注釈があることも知っています。わからないのは、この注釈を@JoinTable2 つの異なるエンティティの両方のフィールドに追加する必要があるかどうかです。ところで、両方に追加する必要がある場合、名前は一致する必要がありますか?

ベストアンサー1

これは実際、良い質問です。どちらの側にも注釈は必要ないため、「所有」エンティティの概念を理解するのに役立ちます@JoinTable。両側に がないようにしたい場合は、良いアイデアですが、一方に要素join tablesが必要です。注釈は、テーブル名、または関連付けをマップする列を指定するために使用されます。mappedBy=@JoinTable

まずは@JoinTable の Javadoc:

関連付けのマッピングを指定します。関連付けの所有側に適用されます。

があるかどうかは、注釈の要素join tableによって制御されます。mappedBy="name"@ManyToManyアノテーションのmappedByのJavadocには次のようにManyToMany書かれています:

リレーションシップを所有するフィールド。リレーションシップが単方向でない限り必須です。

Hibernate (5.0.9.Final) の (双方向) の例では、@ManyToMany注釈が2 つしかなくmappedBy=要素がない場合、デフォルトでは 2 つのEntityテーブルと 2 つの が含まれますJoin Tables

Hibernate: create table Course (id bigint not null, primary key (id))
Hibernate: create table Course_Member (Course_id bigint not null, members_id bigint not null, primary key (Course_id, members_id))
Hibernate: create table Member (id bigint not null, primary key (id))
Hibernate: create table Member_Course (Member_id bigint not null, courses_id bigint not null, primary key (Member_id, courses_id))

これは、各エンティティがその関係を「所有」していることを示していますが、一般的な使用例では、ManyToMany余分なものは冗長です。ただし、エンティティが関係を「所有」するように決定した場合は、エンティティに要素を追加して、関係を所有していないことを指定します。join tableMembermappedBy=Course

@ManyToMany(mappedBy="courses")
Set<Member> members;

@JoinTable(name="Member_Course")エンティティに追加してもMember何も変わりません。テーブルの名前が、いずれにしても付けられる名前と同じになるだけです。

Courseエンティティはもはやその関係を所有していないためManyToMany、追加はJoinTable作成されません。

Hibernate: create table Course (id bigint not null, primary key (id))
Hibernate: create table Member (id bigint not null, primary key (id))
Hibernate: create table Member_Course (members_id bigint not null, courses_id bigint not null, primary key (members_id, courses_id))

これは開発者にとって重要です。なぜなら、所有エンティティ(この場合はエンティティ)に追加されない限り、関係は永続化されないことを理解する必要があるからですMember。ただし、これは双方向の関係であるため、開発者は両方とにかく、 aCourseMember.coursesaMemberですCourse.members

したがって、関係がある場合bidirectional ManyToMany、つまりManyToMany関係する両方のエンティティに がある場合は、mappedBy="name"冗長な を避けるために、どちらかに を追加する必要がありますjoin table。双方向であるため、エンティティをどちら側にするかは問題ではないと思いますowning。いつものように、SQL ログを有効にして、データベースで何が起こっているかを確認することをお勧めします。

参考文献:

一方向の関連付けと双方向の関連付けの違いは何ですか?

双方向関係における関係所有者とはどういう意味ですか?

ORM マッピングにおける「所有側」とは何ですか?

toString() で無限再帰を防ぐ最も効率的な方法は何ですか?

おすすめ記事