前言
这周写项目的时候,出现了一个重要的问题。有两个实体,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,这可不是我们想要的效果,我们要的效果是
@JoinColumn
指定实体之间的外键列
再Student、Clazz中加入@JoinColumn注解
@ManyToOne
@JoinColumn(name="clazzId")
private Clazz clazz;
@OneToMany
@JoinColumn(name="clazzId")
private List<Student> students;
可以看到虽然解决了不出现中间表的这个问题,并且student表中也有clazz_id进行关联了。
但是student属于多的一方N,如果没有指定外键列,还是会自动生成一个中间表
mappedBy
用来指定给‘谁’来维护
//Clazz实体中:
@OneToMany(mappedBy = "clazz")
private List<Student> students = new ArrayList<>();
//Student实体中
@ManyToOne()
private Clazz clazz;
从图中我么可以看到我们创建了两张表,并且再Student中添加了clazz外键进行关联,Student 实体负责维护与 Clazz 实体的关系。
关系图:
总结:
mappedBy用于指定关系的维护端,而@JoinColumn用于指定实体之间的外键列
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。