单向一对多就是我们想通过一的一端获取多的一端的数据
单向多对一就是我们想通过多的一端获取一的一端的数据
但是有些应用我们既想通过一的一端获取多的一端的数据,又想通过多的一端获取一的一端的数据,那么这时候我们就需要配置双向的一对多的关系映射
表结构如下:
student和grade类
public class Student {
private int id;
private String name;
private int age;
private Grade grade;
//get…set
}
public class Grade {
private int id;
private String name;
private Set<Student> students = new HashSet<Student>(0); //get…set
}
student.hbm.xml
<hibernate-mapping package="cn.siggy.pojo">
<class name="Student">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"/>
<property name="age"/>
<many-to-one name="grade" class="Grade" column="grade_id" not-null="true"></many-to-one>
</class>
</hibernate-mapping>
Grade.hbm.xml
<hibernate-mapping package="cn.siggy.pojo">
<class name="Grade">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"/>
<!-- set是 Grade中的集合属性 name属性名称 -->
<set name="students">
<!-- key表示外键 column外键列名-->
<key column="grade_id"></key>
<!-- one-to-many 一对多 类Grade 中 students 所表示类型 -->
<one-to-many class="Student"/>
</set>
</class>
</hibernate-mapping>
如果你是用List或者其他有序集合,那么需要设置外键对应的key列为not null,让hibernate来从集合端管理关联,维护每个元素的索引
测试
session = HibernateUtil.getSession();
tx = session.beginTransaction();
Grade grade = new Grade();
grade.setName("基础");
Student stu = new Student();
stu.setName("张三疯");
stu.setAge(22);
stu.setGrade(grade);
Student stu1 = new Student();
stu1.setName("老王");
stu1.setAge(23);
stu1.setGrade(grade);
//关联
//保存数据的顺序 是根据外键的配置来决定的
//如果外键不能为null,那么先保存一的一端
//如果外键可以为null,则可以随意保存
session.save(grade);
session.save(stu);
session.save(stu1);
tx.commit();
其实综上,双向就是单向一对多和单向多对一都配置