【发布时间】:2015-07-29 02:06:14
【问题描述】:
@JoinColumn 为另一个Entity 提供了一个外键Entity 而@JoinTable 将列出Entity A 和Entity B 之间的所有关系之间的关系。据我所知,它们都是似乎在做类似的事情。我应该什么时候使用其中一种?
【问题讨论】:
标签: java hibernate jpa orm hibernate-mapping
@JoinColumn 为另一个Entity 提供了一个外键Entity 而@JoinTable 将列出Entity A 和Entity B 之间的所有关系之间的关系。据我所知,它们都是似乎在做类似的事情。我应该什么时候使用其中一种?
【问题讨论】:
标签: java hibernate jpa orm hibernate-mapping
假设您有一个实体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 将两个表的 id 存储到一个单独的表中,而 @JoinColumn 将另一个表的 id 存储在一个新列中。
@JoinTable :这是默认类型。当您需要更规范化的数据库时使用它。 IE。以减少冗余。
@JoinColumn :使用它可以获得更好的性能,因为它不需要加入额外的表。
【讨论】:
一个重要的区别:@JoinColumn 总是使用depends upon the context:
- 如果联接是针对使用外键映射策略的 OneToOne 或 ManyToOne 映射,则外键列在
源实体或嵌入。- 如果连接是针对使用外键映射策略的单向 OneToMany 映射,则外键位于 目标实体。
- 如果连接是针对多对多映射或单对一或使用连接表的双向多对一/单对多映射,则
外键在连接表中。- 如果连接用于元素集合,则外键位于集合表中。
【讨论】: