为什么@JoinTable注释始终与@OneToMany注释一起出现

时间:2017-06-26 08:18:55

标签: java hibernate jpa annotations

考虑像项目和任务这样的一对多关联,其中项目可以有多个任务。如果这是使用任务表中的外键子句建模的,该子句引用项目表的主键,那么我们将@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时,拥有方会转移到项目实体?

2 个答案:

答案 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的更改将被忽略)。这是一个不寻常但有效的映射(在双向一对多关联中声明多方拥有方通常更有意义,但也允许相反的做法)。