gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:53:01 24 4
gpt4 key购买 nike

@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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com