[英]Why does Hibernate create a Join Table by default for @OneToMany?
默认情况下, @OneToMany
批注会创建一个@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无法确定UserDocument
内部的User
类型的文件是否与特定的User
- UserDocument
关系相对应。 如果没有mappedBy
属性,则Hibernate只能创建一个联接表或在UserDocument
表中插入一个生成的列。 但是,后者改变了数据模型并引入了更多无法解决的问题(区分生成或声明的列;表架构不匹配模型类;等等)。 因此,Hibernate使用联接表来存储映射。
例如,如果要跟踪修改文档的最后一位,则可能需要在UserDocument
建立另一个多对一的关系。 仅使用反射无法推断和解决此问题。
@Entity
public class UserDocument {
// ...
@ManyToOne
private User user;
@ManyToOne
private User lastModifiedBy;
// ...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.