java - 为什么Hibernate默认为@OneToMany创建Join Table?

标签 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实体,为什么Hibernate不简单地:

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

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

最佳答案

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

例如,如果您想跟踪最后修改文档的人,您可能需要在 UserDocument 中建立另一个多对一关系。仅使用反射无法推断和解决此问题。

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

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

关于java - 为什么Hibernate默认为@OneToMany创建Join Table?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47841283/

相关文章:

java - 从类到 B 类调用数组

java - Primefaces 扩展 CK 编辑器始终呈现为文本区域

java - 无法持久保存附加现有对象的新对象

java - Hibernate Session.get() 会两次访问数据库还是只访问一次数据库?

java - 如何使用 Hibernate 只更新所有实体属性的一部分

Java 和 MS CRM 2016 Web API 更新

java - 如何制作向用户显示图像而不是文本的下拉列表?

java - JPA继承问题

java - 如何使用 SqlResultSetMapping 将 JPA NativeQuery 的结果集映射到 POJO

database - OneToMany(fetch=FetchType.EAGER) 是否执行 N+1 个查询