Hibernate @OneToMany的mappedBy和@JoinColumn总结

来源:互联网 发布:php 权限管理 数据 编辑:IT博客网 时间:2019/09/17 14:19
在一对多和多对一双向关联时:


@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 (?, ?)
0 0