@OneToMany
注释默认情况下会创建一个联接表,除非指定了 mappedBy
元素。
这种行为的原因是什么?例如,对于以下实体:
@Entity
public class User {
// ...
@OneToMany
private List<UserDocument> documents;
// ...
}
@Entity
public class UserDocument {
// ...
@ManyToOne
private User user;
// ...
}
对于User
实体,为什么Hibernate不简单地:
- 通过对
UserDocument
实体进行反射,在UserDocument
中查找类型为User
的字段。 - 自行推断
@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/