我啥时候应该在 JPA 中使用 @JoinColumn 或 @JoinTable?

Posted

技术标签:

【中文标题】我啥时候应该在 JPA 中使用 @JoinColumn 或 @JoinTable?【英文标题】:When Should I Use @JoinColumn or @JoinTable with JPA?我什么时候应该在 JPA 中使用 @JoinColumn 或 @JoinTable? 【发布时间】:2015-07-29 02:06:14 【问题描述】:

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

【问题讨论】:

【参考方案1】:

假设您有一个实体A,它有一个@ManyToOne 关联或一个实体B

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

@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)来保存AB 之间的关联。

【讨论】:

所以 JoinTable 是 N-N 关系? 在数据库术语中,它是多对多关联。在这种情况下,一个 FK 将有一个唯一的约束来将其转换为与连接表的一对多关联。【参考方案2】:

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

@JoinTable :这是默认类型。当您需要更规范化的数据库时使用它。 IE。以减少冗余。

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

【讨论】:

【参考方案3】:

一个重要的区别@JoinColumn 总是使用depends upon the context:

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

【讨论】:

以上是关于我啥时候应该在 JPA 中使用 @JoinColumn 或 @JoinTable?的主要内容,如果未能解决你的问题,请参考以下文章

我啥时候应该在 C 中使用 malloc,啥时候不应该?

我啥时候应该在 C++ 中使用 typedef?

我啥时候应该使用 FutureBuilder?

我啥时候应该在 PL/SQL 中使用过程或函数?

我啥时候应该在 Twitter Bootstrap 中使用容器和行?

我啥时候应该使用 QThread::HighestPriority