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

Utk*_*tku 0 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;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 通过对实体进行反射,找到类型为Userin的字段。UserDocumentUserDocument
  2. 由此推断价值mappedBy@OneToMany自身的注释?

不这样做并生成连接表作为默认行为的原因是什么?为什么 Hibernate(或 JPA)是这样设计的?

Jac*_*k Q 5

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

例如,如果您想跟踪修改文档的最后一个人,您可能需要在UserDocument. 这不能仅使用反射来推断和解决。

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

    @ManyToOne
    private User lastModifiedBy;
    // ...
}
Run Code Online (Sandbox Code Playgroud)