这实际上是一个好问题,它有助于理解“拥有”实体的概念,因为双方都不需要注释。如果你想防止双方都有,一个好主意,那么你需要在一边有一个元素。批注用于指定表名或映射关联的列。@JoinTable
join tables
mappedBy=
@JoinTable
首先看看javadoc@JoinTable:
指定关联的映射。它适用于协会的拥有方。
是否存在 由注释的元素控制。Javadoc for mappedBy for the ManyToMany
注释说:join table
mappedBy="name"
@ManyToMany
拥有关系的字段。必需,除非关系是单向的。
对于Hibernate(5.0.9.Final)中的(双向)示例,如果只有两个注释并且没有元素,则默认值将有两个表和两个:@ManyToMany
mappedBy=
Entity
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))
这对开发人员很重要,因为他或她必须了解,除非将关系添加到拥有实体(在本例中为实体)中,否则不会持久化任何关系。但是,由于这是双向关系,因此开发人员无论如何都应该同时添加 a 和 a。Member
Course
Member.courses
Member
Course.members
因此,如果您有关系,这意味着您涉及两个实体,那么您应该在其中一个实体上添加一个,以避免冗余。由于它是双向的,我认为你制作实体的哪一方并不重要。与往常一样,启用 sql 日志并查看数据库中发生的情况始终是一个好主意:bidirectional
ManyToMany
ManyToMany
mappedBy="name"
join table
owning
引用:
单向关联和双向关联之间有什么区别?
关系所有者在双向关系中意味着什么?
ORM映射中的“拥有方”是什么?
防止 toString()?