为什么 Hibernate 默认为 @OneToMany 创建一个 Join Table?

Why does Hibernate create a Join Table by default for @OneToMany?

@OneToMany 注释,默认情况下,创建一个连接 table,除非指定 mappedBy 元素。

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

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

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

对于 User 实体,为什么不直接休眠:

  1. 通过对 UserDocument 实体进行反射,在 UserDocument 中找到类型为 User 的字段。
  2. 自己推断 @OneToMany 注释的 mappedBy 的值?

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

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

例如,如果要跟踪最后修改文档的人,则可能需要 UserDocument 中的另一个多对一关系。这不能仅仅使用反射来推断和解决。

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

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