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

Sar*_*abo 18 java orm hibernate jpa hibernate-mapping

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

Vla*_*cea 31

假设您有一个与实体A@ManyToOne关联的实体B

@JoinColumnB_ID在使用目标实体表(例如B)时定义目标表外键(例如).

@Entity
public class A {

    private Long id;

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

}
Run Code Online (Sandbox Code Playgroud)

@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;

}
Run Code Online (Sandbox Code Playgroud)

这一次没有A,也不B含有任何外键,因为有一个单独的表(例如A_B)持有之间的关联AB.

  • 在数据库术语中,它是多对多关联。在这种情况下,一个 FK 将具有唯一约束,将其转变为与连接表的一对多关联。 (2认同)

小智 12

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

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

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


mhr*_*ehi 5

一个重要的区别@JoinColumn始终 取决于使用的上下文:

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