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