在一对多和多对一双向关联时:
@OneToMany(cascade=ALL)
// @JoinColumn(name="s_class") //如果一端设置了@JoinColumn,那么它的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 (?, ?)