首先在"一"方类中增加一个集合属性Student:
private Set students = new HashSet();
public Set getStudents(){
return student;
}
public void setStudents(set students){
this.students = students;
}
注意,hibernate要求在持久化中定义集合属性时,必须把属性声明为接口类型,如java.util.Set、java.util.Map、java.util.List.之所以这样做的原因是:当hibernate调用setStudents时,传进去的参数是hibernate自己实现的Set接口的实例。如果把students声明为HashSet类型,就强迫hibernate只能把hashSet类的实例传递给setStudents.
由于在school表中没有直接与students属性直接对应的字段,因此不能用<property>元素来映射students属性,而是要使用<set>元素:
<set
name="students"
cascade="save-update"
>
<key column="school_id"/>
<one-to-many class="Student"/>
</set>
<set>中把inverse设为trueB表明School端的关联只是Student端关联的镜像。当hibernate探测到持久化对象中School和Student端均发生变化时,仅按照Student对象属性的变化来同步更新数据库。
结论:
在映射一对多的双向关联时,应该在"one"的一方把<set>元素的inverse属性设为true.这可以提高应用的性能。
在建立两个对象的双向关联时,应该同时修改修改两端对象的相应属性:
student.setSchool(school);
school.getStudents.add(student);
这样可以提高程序的健壮性,逻辑也更加合理。使业务逻辑层的程序代码不受hibernate的影响。当解除双向关联的关系时,也应该修改两端:
student.setSchool(null);
school.getStudents.remove(student);