在单向关系中没有mappedBy,因此使用@JoinColumn建立外键关联,建立外键的一端即是主控方,主控方相当于拥有指向另一方的外键的一方。
JoinColumn
- 一对一和多对一的@JoinColumn注解的都是在“主控方”,都是本表指向外表的外键名称。
- 一对多的@JoinColumn注解在“被控方”,即一的一方,指的是外表中指向本表的外键名称。一般只有单向关系才在“被控方”中使用@JoinColumn,双向关系使用mappedBy。
- 多对多中,@JoinColumn写的都是本表在中间表的外键名称,inverseJoinColumns写的是另一个表在中间表的外键名称。
mappedBy
mappedBy用于指定具有双向关系的两个实体中哪个实体是被关联处理的,使用mappedBy的一方是被控制的,另一方是主控方。
特点
- 只有OneToOne、OnetoMany、ManyToMany上才可以有mappedBy属性;
- 在@OneToMany注解中,mappedBy表示:由One的一方指向Many的一方;mappedBy的值为Many方中定义的One方类型的字段,即主控方中定义的被控方的对象名;
- 关系的主控方,即Many方负责维护关系,在主控方用@JoinColumn建立外键;
- mappedBy与JoinColumn和JoinTable总是互斥的,不能同时出现在一方;
FetchType.LAZY和FetchType.EAGER区别
- FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载;
- FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载;