Java 为什么@JoinTable注释总是与@OneToMany注释一起出现

Java 为什么@JoinTable注释总是与@OneToMany注释一起出现,java,hibernate,jpa,annotations,Java,Hibernate,Jpa,Annotations,考虑一个一对多的关联,比如项目和任务,其中一个项目可以有多个任务。如果这是使用任务表中的外键子句建模的,该子句引用项目表的主键,那么我们将@JoinColumn注释放在所属端,即任务表,因为多个端始终是所属端。 但是,如果通过使用第三个表project_任务来映射,则@JoinTable注释将用于相反的一侧,即项目实体。但是@JoinTable应该始终位于拥有方 使用外键接近1: @Entity public class Project { @OneToMany(mappedBy = "

考虑一个一对多的关联,比如项目和任务,其中一个项目可以有多个任务。如果这是使用任务表中的外键子句建模的,该子句引用项目表的主键,那么我们将@JoinColumn注释放在所属端,即任务表,因为多个端始终是所属端。 但是,如果通过使用第三个表project_任务来映射,则@JoinTable注释将用于相反的一侧,即项目实体。但是@JoinTable应该始终位于拥有方

使用外键接近1:

@Entity
public class Project {

   @OneToMany(mappedBy = "project")
   private Collection<Task> tasks;

}

@Entity
public class Task {

   @ManyToOne
   @JoinColumn(name="PROJECT_ID")
   private Project project;

}
@实体
公共类项目{
@OneToMany(mappedBy=“项目”)
私人收藏任务;
}
@实体
公开课任务{
@许多酮
@JoinColumn(name=“PROJECT\u ID”)
私人项目;
}
第三个表和@JoinTable注释的方法二:

@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(name=“MY_JT”,
joinColumns=@JoinColumn(
name=“PROJECT\u ID”,
),
inverseJoinColumns=@JoinColumn(
name=“任务\u ID”
)
@独身癖
私有列表任务;
}
@实体
公开课任务{
私人项目;
}

为什么在使用@JoinTable时,拥有方会转移到项目实体?

尝试将拥有方理解为知道关联另一端的实体

如果我能够联系到相关实体,那么我就是拥有实体,因此我拥有能够联系到相关实体的信息

最常用的情况是将外键放在关联的多个方面。 所以,如果你有一个项目和任务之间的关系,我们告诉你,一个项目可以有很多任务。 一个项目id列将被添加到任务表中,该任务表将成为关系的拥有方,因为它包含信息(项目Fk),允许它从Car到达项目实体

当您在OneToMany关联上使用@Jointable时,您正在设计一个单向关联,这样汽车实体就不再像双向关联中那样具有到达关联用户实体的信息。 该信息现在由用户实体中的联接表保存,因此用户实体成为关系的拥有方

所以为了回答您的问题,拥有方转向了Projet,因为现在您无法再从任务访问项目,而将任务关联到项目的唯一方法是使用项目实体持有的联接表。因此,现在它是项目实体,通过其联接表保留信息来检索与项目关联的任务。
希望清楚。

您所说的“移位”是什么意思?关联的拥有方可能是该关联的唯一一方,也可能是其关联注释不存在
mappedBy
参数的一方

在第二个示例中,
Project
是拥有方,因为关联是单向的(在
Task
中没有该关联的映射)

关联的拥有方是管理关联的一方(即,将记录对该方的更改)。是否已将
Task
定义为:

@Entity
public class Task {
   @ManyToOne(mappedBy="tasks")
   private Project project;
}
Project
仍将是拥有方(意思是:对
Project.tasks
的更改将被记录,而对
Task.Project
的更改将被忽略)。这是一个不寻常但有效的映射(在双向一对多关联中,将多方声明为拥有方通常更有意义,但也允许做相反的事情)