Hibernate中mappedBy和@JoinColumn二者的使用心得

在单向关系中没有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注解的心得,希望能帮助到大家,有何不妥请及时指正~


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值