可以使用@OneToMany
注释禁用@JoinColumn
关系连接表。默认为连接表。
例如,生产系统有哪些优点和缺点?
什么时候应该使用连接表?何时不使用?
谢谢。
答案 0 :(得分:19)
默认情况下@OneToMany
只有在您使用单向关系时才会创建联接表。
换句话说,如果您有Employee
和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;
}
不会使用连接表,因为“many”端将用于存储此关系的外键。
但是,即使在与定义的@OneToMany
属性具有双向mappedBy
关系的情况下,也可以强制使用连接表。您可以在关系的拥有方使用@JoinTable
注释来实现它。
正如您所提到的,如果默认使用连接表(单向@JoinColumn
关系),也有可能使用@OneToMany
。
最好为自己测试FK并加入表性能差异。我可以猜测,较少的连接(在这种情况下:FK)似乎有更好的性能。
此外,有时DBA定义数据库模式,您只需要将映射适合现有模式。那你就别无选择FK或加入表 - 这就是你可以选择的原因。
答案 1 :(得分:0)
多态性需要连接表。例如,如果Employee和Manager链接同一个项目,并且它们使用每个表一个表策略映射,那么在关系数据库级别,知道该项目的唯一方法(id = 1,emp_id = 10)是指经理是将emp_id放在manager_2_employee表中。如果没有这种情况,那么emp_id可以直接进入项目。
答案 2 :(得分:0)
正如上面的评论中所提到的,默认情况下hibernate用于连接表。 这导致更好的数据库规范化。
如果有选择,JoinColumn会提供比连接表更好的性能,因为删除了在SQL查询中加入额外表的需要。