默认情况下,除非指定了@OneToMany
元素,否则mappedBy
注释将创建一个联接表。
这种行为的原因是什么?例如,具有以下实体:
@Entity
public class User {
// ...
@OneToMany
private List<UserDocument> documents;
// ...
}
@Entity
public class UserDocument {
// ...
@ManyToOne
private User user;
// ...
}
对于
User
实体,为什么不简单地休眠:通过对
User
实体进行反射,在UserDocument
中找到类型为UserDocument
的字段。自己推断
mappedBy
注释的@OneToMany
值?不这样做并生成联接表作为默认行为的原因是什么?为什么Hibernate(或JPA)是以此方式设计的?
最佳答案
这背后的一个简单原因是,Hibernate无法确定User
内部的UserDocument
类型的文件是否对应于特定的User
-UserDocument
关系。没有mappedBy
属性,Hibernate只能创建一个联接表或在UserDocument
表中插入一个生成的列。但是,后者改变了数据模型并带来了更多无法解决的问题(区分生成或声明的列;表架构不匹配模型类;等等)。因此,Hibernate使用联接表来存储映射。
例如,如果要跟踪修改文档的最后一位,则可能需要UserDocument
中的另一对多关系。仅使用反射无法推断和解决此问题。
@Entity
public class UserDocument {
// ...
@ManyToOne
private User user;
@ManyToOne
private User lastModifiedBy;
// ...
}