【问题标题】:Why is the @JoinTable annotation is always present along with the @OneToMany annotation为什么@JoinTable 注释总是与@OneToMany 注释一起出现
【发布时间】:2017-06-26 08:18:55
【问题描述】:

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

【问题讨论】:

    标签: java hibernate jpa annotations


    【解决方案1】:

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

    如果我能够联系相关实体,我就是拥有实体,因此我有信息可以联系相关实体。

    最常用的情况是将外键放在关联的多端。 因此,如果您在 Project 和 Task 之间存在关系,并且我们告诉您 1 Project 可以有多个 Task。 将在 Task 表中添加一个 project_id 列,该列将成为关系的拥有方,因为它包含允许它从 Car 到达 Project Entity 的信息 (Project Fk)。

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

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

    【讨论】:

      【解决方案2】:

      你所说的“转移”是什么意思?关联的拥有方要么是该关联的 only 方,要么是其关联注释不存在 mappedBy 参数的一方。

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

      关联的拥有方是管理关联的一方(即,将记录对该方的更改)。如果Task 是这样定义的:

      @Entity
      public class Task {
         @ManyToOne(mappedBy="tasks")
         private Project project;
      }
      

      Project 仍然是拥有方(意思是:对Project.tasks 的更改将被记录,而对Task.project 的更改将被忽略)。这是一个不寻常但有效的映射(在双向一对多关联中将多方声明为拥有方通常更有意义,但也允许执行相反的操作)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多