繁体   English   中英

为什么默认情况下Hibernate为@OneToMany创建一个Join Table?

[英]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实体,为什么不简单地休眠:

  1. 找到类型的字段UserUserDocument通过做反射UserDocument的实体。
  2. 推断值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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM