エンティティCourse
とエンティティがありUser
ます。多対多コースとユーザーの関係。コースには多くのユーザーがいて、ユーザーは多くのコースに登録できるためです。両方のエンティティで、@ManyToMany
特定のフィールドに注釈を付けました。つまり、次のCourse
ようになります。
@ManyToMany
private List<RegisteredUser> members;
そしてUser
私は持っています:
@ManyToMany
private List<Course> coursesTaken;
さて、このような多対多の関係は、通常、3 番目のテーブルで表されます。また、@JoinTable
それを可能にする注釈があることも知っています。わからないのは、この注釈を@JoinTable
2 つの異なるエンティティの両方のフィールドに追加する必要があるかどうかです。ところで、両方に追加する必要がある場合、名前は一致する必要がありますか?
ベストアンサー1
これは実際、良い質問です。どちらの側にも注釈は必要ないため、「所有」エンティティの概念を理解するのに役立ちます@JoinTable
。両側に がないようにしたい場合は、良いアイデアですが、一方に要素join tables
が必要です。注釈は、テーブル名、または関連付けをマップする列を指定するために使用されます。mappedBy=
@JoinTable
関連付けのマッピングを指定します。関連付けの所有側に適用されます。
があるかどうかは、注釈の要素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 table
Member
mappedBy=
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
。ただし、これは双方向の関係であるため、開発者は両方とにかく、 aCourse
とMember.courses
aMember
ですCourse.members
。
したがって、関係がある場合bidirectional
ManyToMany
、つまりManyToMany
関係する両方のエンティティに がある場合は、mappedBy="name"
冗長な を避けるために、どちらかに を追加する必要がありますjoin table
。双方向であるため、エンティティをどちら側にするかは問題ではないと思いますowning
。いつものように、SQL ログを有効にして、データベースで何が起こっているかを確認することをお勧めします。
参考文献: