我应该何时使用@JoinColumn或@JoinTable和JPA?

时间:2015-05-17 15:20:50

标签: java hibernate jpa orm hibernate-mapping

@JoinColumn为另一个Entity提供Entity个外键,而@JoinTable将列出Entity A和Entity之间所有关系之间的关系B.据我所知,他们似乎都做了类似的事情。我什么时候应该使用其中一种?

3 个答案:

答案 0 :(得分:30)

假设您有一个实体A,其中@ManyToOne关联实体B

@JoinColumn会在使用目标实体表(例如B_ID)时定义目标表外键(例如B)。

@Entity
public class A {

    private Long id;

    @ManyToOne
    @JoinColumn(name="B_ID")
    private B b;

}

@JoinTable将使用单独的表格来保存AB之间的关系。

@Entity
public class A {

    private Long id;

    @ManyToOne
    @JoinTable(
       name = "A_B", 
       joinColumns = @JoinColumn(name = "B_ID"), 
       inverseJoinColumns = @JoinColumn(name = "A_ID")
    )
    private B b;

}

这次AB都不包含任何外键,因为有一个单独的表(例如A_B)来保存A和{{1}之间的关联}。

答案 1 :(得分:12)

@JoinTable将表的id都存储到一个单独的表中,而@JoinColumn将另一个表的id存储在一个新列中。

@JoinTable:这是默认类型。当您需要更规范化的数据库时,请使用此选项。即。减少冗余。

@JoinColumn:使用它可以获得更好的性能,因为它不需要加入额外的表。

答案 2 :(得分:2)

一个重要的区别@JoinColumn始终depends upon the context被使用:

  • 如果联接用于使用外键映射策略的OneToOne或ManyToOne映射,则外键列在
    的表中 源实体或可嵌入。
  • 如果联接是使用外键映射策略进行的单向OneToMany映射,则外键在以下表格中 目标实体。
  • 如果联接是针对使用联接表的ManyToMany映射或OneToOne或双向ManyToOne / OneToMany映射,则
    外键在联接表中。
  • 如果联接用于元素集合,则外键在集合表中。