我啥时候应该在 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 将使用一个单独的表来保存A
和B
之间的关系。
@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;
这次A
和B
都不包含任何外键,因为有一个单独的表(例如A_B
)来保存A
和B
之间的关联。
【讨论】:
所以 JoinTable 是 N-N 关系? 在数据库术语中,它是多对多关联。在这种情况下,一个 FK 将有一个唯一的约束来将其转换为与连接表的一对多关联。【参考方案2】:@JoinTable 将两个表的 id 存储到一个单独的表中,而 @JoinColumn 将另一个表的 id 存储在一个新列中。
@JoinTable :这是默认类型。当您需要更规范化的数据库时使用它。 IE。以减少冗余。
@JoinColumn :使用它可以获得更好的性能,因为它不需要加入额外的表。
【讨论】:
【参考方案3】:一个重要的区别:@JoinColumn
总是使用depends upon the context:
如果联接是针对使用外键映射策略的 OneToOne 或 ManyToOne 映射,则外键列在 源实体或嵌入。 如果连接是针对使用外键映射策略的单向 OneToMany 映射,则外键位于 目标实体。 如果连接是针对多对多映射或单对一或使用连接表的双向多对一/单对多映射,则 外键在连接表中。 如果连接用于元素集合,则外键位于集合表中。
【讨论】:
以上是关于我啥时候应该在 JPA 中使用 @JoinColumn 或 @JoinTable?的主要内容,如果未能解决你的问题,请参考以下文章