Hibernate @OneToMany的mappedBy和@JoinColumn总结

在一对多和多对一双向关联时:


@OneToMany(cascade=ALL)
// @JoinColumn(name="s_class") //如果一端设置了@JoinColumn(这时删除一端时不会抛出异常,多端外键被设置为null),那么它的name和多端的@joinColumn的name是一样的。
//但如果设置的是mappedBy的话,那么它的值和多端的getCla的"cla"是一样的。
public Set<Student> getStudents() {
return students;
}


@ManyToOne
@JoinColumn(name="s_class")
public SClass getCla() {
return cla;
}

下面是在一端设置各自属性时输出的SQL语句:
mappedBy:
Hibernate: insert into SClass (name) values (?)
Hibernate: insert into Student (s_class, name) values (?, ?)
Hibernate: insert into Student (s_class, name) values (?, ?)


@JoinColumn:
Hibernate: insert into SClass (name) values (?)
Hibernate: insert into Student (s_class, name) values (?, ?)
Hibernate: insert into Student (s_class, name) values (?, ?)
Hibernate: update Student set s_class=? where id=?
Hibernate: update Student set s_class=? where id=?


我发现mappedBy和@JoinColumn还有一个区别是,在一端设置了@JoinColumn的时候,主控制方在一端,
也就是在一端set多端的时候,数据库会为你保存级联关系(在多端指向一端的外键设置值了)。
SClass c=new SClass();
c.getStudents().add(s);
c.getStudents().add(s1);
session.save(c);
这样就行了。但还是建议设置mappedBy让多端设置这种关联比较好。


两者都不用的时候会为OneToMany新建一个关联表SClass_Student。
Hibernate: insert into SClass (name) values (?)
Hibernate: insert into Student (s_class, name) values (?, ?)
Hibernate: insert into Student (s_class, name) values (?, ?)
Hibernate: insert into SClass_Student (SClass_id, students_id) values (?, ?)
Hibernate: insert into SClass_Student (SClass_id, students_id) values (?, ?)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值