4

前言

这周写项目的时候,出现了一个重要的问题。有两个实体,A实体,B实体。A实体和B实体的关系是多对一,B实体和A实体的关系是一对多。那么此时使只用@ManyToOne和@OneTOMany的话,并没加上mappedBy属性会是什么情况,使用@JoinColumn 又是什么情况呢?

开始

例:

我们有两个实体:Student和Clazz
关系:

Student和Clazz 关系是多对一,一个或者多个学生必须属于一个班级。
Clazz和Student关系是一对多,一个班级可以是一个学生,也可以是很多个学生。

学生类:

@Entity
public class Student {

    @Id
    private Long id;

    private String name;

    @ManyToOne
    private Clazz clazz;
    
}

班级类:

@Entity
public class Clazz {
    @Id
    protected Long id;

    private String name;

    @OneToMany
    private List<Student> students;
}

再图下我们可以看到,只创建了两张表。却出现了第三表,中间表clazz_students,这可不是我们想要的效果,我们要的效果是

image.png

@JoinColumn

指定实体之间的外键列
再Student、Clazz中加入@JoinColumn注解

    @ManyToOne
    @JoinColumn(name="clazzId")
    private Clazz clazz;

    @OneToMany
    @JoinColumn(name="clazzId")
    private List<Student> students;

可以看到虽然解决了不出现中间表的这个问题,并且student表中也有clazz_id进行关联了。

image.png

但是student属于多的一方N,如果没有指定外键列,还是会自动生成一个中间表

image.png

mappedBy

用来指定给‘谁’来维护

    //Clazz实体中:
   @OneToMany(mappedBy = "clazz")
    private List<Student> students = new ArrayList<>();

    //Student实体中
    @ManyToOne()
    private Clazz clazz;

从图中我么可以看到我们创建了两张表,并且再Student中添加了clazz外键进行关联,Student 实体负责维护与 Clazz 实体的关系。

image.png

关系图:
image.png

总结:

mappedBy用于指定关系的维护端,而@JoinColumn用于指定实体之间的外键列


zZ_jie
436 声望9 粉丝

虚心接受问题,砥砺前行。