一对多关联映射利用了多对一关联映射的原理。
多对一关联映射:在多的一端加入一个外键指向一的一端,但是维护的关系是多指向一的一端。
一对多关联映射:在多的一端加入一个外键指向一的一端,但是维护的关系是一指向多的一端。
两者映射策略是一样的,只是站的角度不同。
Hibernate一对多映射(class--àstudent单向):
一般用set集合,set里面的内容不可重复。也可以用别的集合。
在一的一端维护关系的缺点:
*如果在t_student中的classId设置为非空not null,则无法保存。
*因为不是在student一端维护关系,student不知道是哪个班的,所以会发出多余的update语句来更新关系。
通常会做成双向的,在多的一端维护关系。
Student.hbm.xml
<hibernate-mapping>
<class name="com.bjsxt.hibernate.Student" table="t_student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
Classes.hbm.xml
<hibernate-mapping package="com.bjsxt.hibernate">
<class name="Classes" table="t_classes">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="students">
<key column="classesid"/>
<one-to-many class="Student"/>
</set>
</class>
</hibernate-mapping>
存储:必须先存学生,否则报错。
session.beginTransaction();
Student student1 = new Student();
student1.setName("10");
session.save(student1);
Student student2 = new Student();
student2.setName("祖儿");
session.save(student2);
Set students = new HashSet();
students.add(student1);
students.add(student2);
Classes classes = new Classes();
classes.setName("尚学堂");
classes.setStudents(students);
//可以正确保存
session.save(classes);
session.getTransaction().commit();
加载:
session.beginTransaction();
Classes classes = (Classes)session.load(Classes.class, 1);
System.out.println("classes.name=" + classes.getName());
Set students = classes.getStudents();
for (Iterator iter=students.iterator(); iter.hasNext();) {
Student student = (Student)iter.next();
System.out.println("student.name=" + student.getName());
}
session.getTransaction().commit();