默认情况下,除非指定了@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;
    // ...
}

09-09 19:38