@JoinColumn
为另一个Entity
提供Entity
个外键,而@JoinTable
将列出Entity
A和Entity
之间所有关系之间的关系B.据我所知,他们似乎都做了类似的事情。我什么时候应该使用其中一种?
答案 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将使用单独的表格来保存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
和{{1}之间的关联}。
答案 1 :(得分:12)
@JoinTable将表的id都存储到一个单独的表中,而@JoinColumn将另一个表的id存储在一个新列中。
@JoinTable:这是默认类型。当您需要更规范化的数据库时,请使用此选项。即。减少冗余。
@JoinColumn:使用它可以获得更好的性能,因为它不需要加入额外的表。
答案 2 :(得分:2)
一个重要的区别:@JoinColumn
始终depends upon the context被使用:
- 如果联接用于使用外键映射策略的OneToOne或ManyToOne映射,则外键列在
的表中 源实体或可嵌入。- 如果联接是使用外键映射策略进行的单向OneToMany映射,则外键在以下表格中 目标实体。
- 如果联接是针对使用联接表的ManyToMany映射或OneToOne或双向ManyToOne / OneToMany映射,则
外键在联接表中。- 如果联接用于元素集合,则外键在集合表中。