OneToMany - 连接表和外键之间有什么区别?

时间:2011-12-20 08:24:12

标签: mapping jpa-2.0 eclipselink one-to-many

可以使用@OneToMany注释禁用@JoinColumn关系连接表。默认为连接表。

例如,生产系统有哪些优点和缺点?
什么时候应该使用连接表?何时不使用?

谢谢。

3 个答案:

答案 0 :(得分:19)

默认情况下@OneToMany只有在您使用单向关系时才会创建联接表。

换句话说,如果您有EmployeeProject个实体,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查询中加入额外表的需要。