前两节写了两个例子,分别是单向多对一的映射和单向一对多的映射,这一节继续以这个例子讲一下双向一对多的映射方法,如下图所示:
很多时候,我们既想从一对端获取多对端的信息,又想从多对端获取一对端的数据,这就是需要双向一对多的映射关系,这也是最常见的表与表的映射关系,在hibernate中应当这样配置:
新建Studnet实体类:
public class Student {private int id;private String name;private String sex;private Grade grade;
//get/set方法省略
}
新建Grade实体类:
public class Grade {private int id;private String name;private String teacher;private Set
}
当前包下新建Student的映射文件Student.hbm.xml:
xml version="1.0"?>
DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package&#61;"com.wang.pojo"><class name&#61;"Student" ><id name&#61;"id"><generator class&#61;"native">generator>id><property name&#61;"name">property><property name&#61;"sex">property><many-to-one name&#61;"grade" class&#61;"Grade" column&#61;"gradeId" not-null&#61;"true">many-to-one>class>
hibernate-mapping>
当前包下新建Grade的映射文件Grade.hbm.xml:
xml version&#61;"1.0"?>
DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package&#61;"com.wang.pojo"><class name&#61;"Grade" ><id name&#61;"id"><generator class&#61;"native">generator>id><property name&#61;"name">property><property name&#61;"teacher">property><set name&#61;"students"><key column&#61;"gradeId" >key><one-to-many class&#61;"Student"/>set>class>
hibernate-mapping>
将两个映射文件添加到hibernate.cfg.xml中去,新建测试类,测试1:自动生成表结构2:存取数据3:读取数据(分别测试从Student一端读取,以及从grade一段读取):
&#64;Testpublic void testCreateDB() {Configuration cfg &#61; new Configuration().configure();SchemaExport se &#61; new SchemaExport(cfg);// 第一个参数是否生成ddl脚本 第二个参数是否执行到数据库se.create(true, true);}&#64;Testpublic void testSave() {Session session &#61; HibernateUtil.getSession();Transaction tx &#61; session.beginTransaction();// Score s&#61;new Score(2,12,97);// session.save(s);Grade g&#61;new Grade(1, "终极一班", "王大炮");Student s1&#61;new Student(12, "李云龙", "男", g);Student s2&#61;new Student(13, "赵刚", "男", g);session.save(g);session.save(s1);session.save(s2);tx.commit();session.close();}&#64;Testpublic void testGet() {Session session &#61; HibernateUtil.getSession();Transaction tx &#61; session.beginTransaction();//从Grade一端获取数据Grade g&#61;(Grade)session.get(Grade.class, 1);System.out.println("id&#61;"&#43;g.getId()&#43;"name&#61;"&#43;g.getName()&#43;"teacher&#61;"&#43;g.getTeacher());Iterator
总结:在双向一对多的映射关系中,注意一的一端(Grade)配置: