为什么Hibernate默认为@OneToMany创建一个连接表?

时间:2017-12-15 23:55:34

标签: java hibernate jpa relational-database libraries

默认情况下,

@OneToMany注释会创建一个连接表,除非指定了mappedBy元素。

这种行为的原因是什么?例如,使用以下实体:

@Entity
public class User {
    // ...
    @OneToMany
    private List<UserDocument> documents;
    // ...
}

@Entity
public class UserDocument {
    // ...
    @ManyToOne
    private User user;
    // ...
}

对于User实体,为什么不简单地进行休眠:

  1. 通过对User实体进行反思,在UserDocument中找到类型为UserDocument的字段。
  2. 单独为mappedBy注释推断@OneToMany的值?
  3. 不执行此操作并生成连接表作为默认行为的原因是什么?为什么Hibernate(或JPA)是这样设计的?

1 个答案:

答案 0 :(得分:4)

这背后的一个简单原因是,Hibernate无法确定User内的UserDocument类型的字段是否与特定的User - UserDocument关系相对应。如果没有mappedBy属性,Hibernate只能在UserDocument表中创建连接表或插入生成的列。但是,后者改变了数据模型并引入了比它可能解决的更多问题(区分生成或声明的列;表模式不匹配模型类;等等)。因此,Hibernate使用连接表来存储映射。

例如,如果要跟踪修改文档的最后一个,您可能需要UserDocument中的另一个多对一关系。只能使用反射来解决这个问题。

@Entity
public class UserDocument {
    // ...
    @ManyToOne
    private User user;

    @ManyToOne
    private User lastModifiedBy;
    // ...
}