在单向关系中没有mappedBy,因此使用@JoinColumn建立外键关联,建立外键的一端即主控端,主控方相当于拥有指向另一方的外键的一方。
1、一对一和多对一的@JoinColumn注解的都是在“主控方”,都是本表指向外表的外键名称。
2、一对多的@JoinColumn注解在“被控方”,即一的一方,指的是外表中指向本表的外键名称,一般只有单向关系才在“被控方”中使用@JoinColumn,双向关系使用mappedBy,这一点很容易造成混淆,初学时我也搞不清具体应该怎么用。
3、多对多中,@JoinColumn写的都是本表在中间表的外键名称,inverseJoinColumns写的是另一个表在中间表的外键名称。
多对多关系举例:
主控方:@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = "Teacher_Student", joinColumns = {@JoinColumn(name = "Teacher_ID", referencedColumnName = "teacherid")}, inverseJoinColumns = {@JoinColumn(name = "Student_ID", referencedColumnName ="studentid")})
public Set<Student> getStudents() {
return students;
}
被控方:
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "students")
public Set<Teacher> getTeachers() {
return teachers;
}
@ManyToMany注释表示Teacher是多对多关系的一端。@JoinTable描述了多对多关系的数据表关系。name属性指定中间表名称,joinColumns定义中间表与Teacher表的外键关
系。上面的代码中,中间表Teacher_Student的Teacher_ID列是Teacher表的主键列对应的外键列,inverseJoinColumns属性定义了中间表与另外一端(Student)的外键关系。
mappedBy用于指定具有双向关系的两个实体中哪个实体是被关联处理的,使用mappedBy的一方肯定是被控方。它有如下四个特点:
1、只有OneToOne、OneToMany、ManyToMany上才有mappedBy属性,ManyToOne不存在该属性。
2、@OneToMany(mapped=“由One的一方指向Many的一方,并且,这个属性应该等于Many的一方中含有One类的属性的对象名,否则会出错”),即主控方中定义的被控方的对象名。
3、关系的主控方(即Many的一方)负责关系的维护,在主控方用到@JoinColumn建立外键。
4、mappedBy与JoinColumn/JoinTable总是处于互斥的一方。以上是我通过一些项目经验学习到的关于Hibernate中ORM注解的心得,希望能帮助到大家,有何不妥请及时指正~