@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)是这样设计的?
答案 0 :(得分:4)
这背后的一个简单原因是,Hibernate无法确定User
内的UserDocument
类型的字段是否与特定的User
- UserDocument
关系相对应。如果没有mappedBy
属性,Hibernate只能在UserDocument
表中创建连接表或插入生成的列。但是,后者改变了数据模型并引入了比它可能解决的更多问题(区分生成或声明的列;表模式不匹配模型类;等等)。因此,Hibernate使用连接表来存储映射。
例如,如果要跟踪修改文档的最后一个,您可能需要UserDocument
中的另一个多对一关系。只能使用反射来解决这个问题。
@Entity
public class UserDocument {
// ...
@ManyToOne
private User user;
@ManyToOne
private User lastModifiedBy;
// ...
}