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

9 mapping one-to-many eclipselink jpa-2.0

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

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

谢谢.

Pio*_*cki 19

默认情况下,@OneToMany只有在使用单向关系时才会创建连接表.

换句话说,如果您拥有EmployeeProject实体,并且Employee实体定义如下(假设orm.xml这些实体没有条目):

@Entity
public class Employee {
    // ...

    @OneToMany
    Set<Project> projects;
}

@Entity
public class Project {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

JPA提供程序将创建一个连接表(注意注释中没有mappedBy属性,@OneToMany因为没有对Employee实体的引用Project).

另一方面,如果您将使用双向关系:

@Entity
public class Employee {
    // ...

    @OneToMany(mappedBy="employee")
    Set<Project> projects;
}

@Entity
public class Project {
    // ...

    @ManyToOne
    Employee employee;
}
Run Code Online (Sandbox Code Playgroud)

将不使用连接表,因为将使用"many"一侧来存储此关系的外键.

但是,即使在@OneToMany与定义mappedBy属性具有双向关系的情况下,也可以强制使用连接表.您可以@JoinTable在关系的拥有方使用注释来实现它.

正如您所提到的,@JoinColumn如果默认使用连接表(单向@OneToMany关系),也有可能使用.

最好为自己测试FK并加入表性能差异.我可以猜测,较少的连接(在这种情况下:FK)似乎有更好的性能.

此外,有时DBA定义数据库模式,您只需要将映射适合现有模式.那你就别无选择FK或加入桌子 - 这就是你有选择的原因.