Java 我什么时候应该在JPA中使用@JoinColumn或@JoinTable?
Java 我什么时候应该在JPA中使用@JoinColumn或@JoinTable?,java,hibernate,jpa,orm,hibernate-mapping,Java,Hibernate,Jpa,Orm,Hibernate Mapping,@JoinColumn给一个实体另一个实体一个外键,而@JoinTable将列出实体a和实体B之间的所有关系。据我所知,它们似乎都做了类似的事情。什么时候应该使用一个或另一个?假设您有一个实体A,它与一个实体B有@manytone关联 将在使用目标实体表(例如B)时定义目标表外键(例如B) 将使用单独的表来保存a和B之间的关系 @Entity public class A { private Long id; @ManyToOne @JoinColumn(name="
@JoinColumn
给一个实体
另一个实体
一个外键,而@JoinTable
将列出实体
a和实体
B之间的所有关系。据我所知,它们似乎都做了类似的事情。什么时候应该使用一个或另一个?假设您有一个实体A
,它与一个实体B
有@manytone
关联
将在使用目标实体表(例如B
)时定义目标表外键(例如B
)
将使用单独的表来保存a
和B
之间的关系
@Entity
public class A {
private Long id;
@ManyToOne
@JoinColumn(name="B_ID")
private B 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\u B
)来保存A
和B。@JoinTable将两个表的id存储到一个单独的表中,而@JoinColumn将另一个表的id存储到一个新列中
@Entity
public class A {
private Long id;
@ManyToOne
@JoinColumn(name="B_ID")
private B 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;
}
@JoinTable:这是默认类型。当您需要更规范化的数据库时,请使用此选项。即减少冗余
@JoinColumn:使用它可以获得更好的性能,因为它不需要连接额外的表 一个重要区别:@JoinColumn
始终使用它:
- 如果联接用于使用外键映射策略的一对一映射或多对一映射,则外键列位于
源实体或可嵌入
- 如果联接用于使用外键映射策略的单向OneToMany映射,则外键位于
目标实体
- 如果联接用于多个映射或使用联接表的一对一或双向多对一/一对一映射,则
外键位于联接表中
- 如果联接用于元素集合,则外键位于集合表中
那么JoinTable是一种N-N关系吗?在数据库术语中,它是一种多对多关联。在这种情况下,一个FK将具有唯一的约束,以将其转换为与联接表的一对多关联。