默认情况下@OneToMany
仅当您使用时才会创建连接表单向关系.
换句话说,如果你有Employee
and Project
实体和Employee
实体定义如下(假设没有orm.xml
这些实体的条目):
@Entity
public class Employee {
// ...
@OneToMany
Set<Project> projects;
}
@Entity
public class Project {
// ...
}
JPA 提供商将创建一个连接表(注意没有mappedBy
属性在@OneToMany
注释,因为没有引用Employee
实体来自Project
).
另一方面,如果您使用双向关系:
@Entity
public class Employee {
// ...
@OneToMany(mappedBy="employee")
Set<Project> projects;
}
@Entity
public class Project {
// ...
@ManyToOne
Employee employee;
}
将不会使用连接表,因为将使用“多”端来存储此关系的外键。
但是,即使在具有双向连接的情况下,您也可以强制使用连接表@OneToMany
与定义的关系mappedBy
属性。你可以使用它来实现@JoinTable关系拥有方的注释。
正如您所提到的,还有一种可能性可以使用@JoinColumn
如果默认使用连接表(单向@OneToMany
关系)。
最好亲自测试 FK 和连接表的性能差异。我只能猜测较少的连接(在本例中:FK)似乎具有更好的性能。
此外,有时 DBA 定义了数据库模式,您只需将映射调整到现有模式即可。那么你就别无选择 FK 或连接表 - 这就是你有选择的原因。