考虑像项目和任务这样的一对多关联,其中项目可以有多个任务。如果这是使用任务表中的外键子句建模的,该子句引用项目表的主键,那么我们将@JoinColumn注释放在拥有方,即任务表中,因为多方始终是拥有方。 但是如果通过使用第三个表project_task来映射,则@JoinTable注释正在反面使用,即在项目实体上使用。但是@JoinTable应该始终站在自己的一边。
使用外键接近一个:
@Entity
public class Project {
@OneToMany(mappedBy = "project")
private Collection<Task> tasks;
}
@Entity
public class Task {
@ManyToOne
@JoinColumn(name="PROJECT_ID")
private Project project;
}
使用第三个表和@JoinTable Annotation接近二:
@Entity
public class Project {
@JoinTable(name = "MY_JT",
joinColumns = @JoinColumn(
name = "PROJECT_ID",
),
inverseJoinColumns = @JoinColumn(
name = "TASK_ID"
)
@OneToMany
private List<Task> tasks;
}
@Entity
public class Task {
private Project project;
}
为什么在使用@JoinTable时,拥有方会转移到项目实体?
答案 0 :(得分:0)
尝试将拥有方理解为知道关联另一端的实体。
我是拥有实体,如果我能够到达相关实体,那么我有信息可以让我到达相关实体。
最常用的情况是将外键放在关联的许多方面。 因此,如果你有Project和Task之间的关系,我们就知道1 Project可以有很多任务。 project_id列将添加到Task表中,该表将是关系的拥有方,因为它保存了允许它从Car到达Project Entity的信息(Project Fk)。
当您在OneToMany关联上使用@Jointable时,您正在设计单向关联,因此汽车实体不再具有到达关联用户实体的信息,就像在双向关联中一样。 此信息现在由用户实体中的连接表保存,因此用户实体成为关系的拥有方。
因此,为了回答您的问题,拥有方转移到Projet,因为现在您不能再从任务到达项目,并且与项目关联的任务的唯一方法是使用Project实体持有的连接表。所以现在它是项目实体,通过它的joinTable保存信息,以检索与项目相关的任务。 希望很清楚。
答案 1 :(得分:0)
你的意思是&#39;转移&#39;?关联的拥有方是该关联的唯一方,或其关联注释不存在mappedBy
参数的一方。
在您的第二个示例中,Project
是拥有方,因为关联是单向的(Task
中没有该关联的映射)。
关联的拥有方是管理关联的方(即将记录对该方的更改)。如果Task
定义如下:
@Entity
public class Task {
@ManyToOne(mappedBy="tasks")
private Project project;
}
Project
仍然是拥有方(意味着:会记录对Project.tasks
的更改,而对Task.project
的更改将被忽略)。这是一个不寻常但有效的映射(在双向一对多关联中声明多方拥有方通常更有意义,但也允许相反的做法)。