单向一对多映射和双向一对多映射

来源:互联网 发布:淘宝ipad客户端下载 编辑:程序博客网 时间:2024/06/05 17:51

上一篇博客以学生类Student和年级类Grade为例介绍了单向多对一映射,我们还以这两个类来看下单向一对多映射,以学生类为多的一端年级类为一的一端。

示例:

学生类Student

public class Student {private int id;private String name;private int age;//省略get/set方法}
年级类Grade

public class Grade {private int id;private String name;private Set<Student> students=new HashSet<Student>();//省略get/set}
Student.hbm.xml配置文件

<hibernate-mapping package="com.test.pojo"><class name="Student"><id name="id"><generator class="native"></generator></id><property name="name" /><property name="age"/></class></hibernate-mapping>
Grade.hbm.xml配置文件

<hibernate-mapping package="com.test.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" not-null="true"/>  <!-- 一对多  类Grade中students所表示类型 -->  <one-to-many class="Student"/></set></class></hibernate-mapping>
测试类

public class HibernateTest {@Testpublic void testCreateDB(){Configuration cfg=new Configuration().configure();SchemaExport se=new SchemaExport(cfg);//第一个参数表示是否生成ddl脚本,第二个参数表示是否执行到数据库中se.create(true, true);}/** * 保存数据 */@Testpublic void save(){Session session=null;Transaction tx=null;try{session=HibernateUtil.getSession();tx=session.beginTransaction();Grade grade=new Grade();grade.setName("大一");Student stu=new Student();stu.setName("王五");stu.setAge(20);Student stu1=new Student();stu1.setName("李四");stu1.setAge(20);//关联grade.getStudents().add(stu);grade.getStudents().add(stu1);//保存数据的顺序是根据外键的配置来决定的//如果外键不能为null,县保存一的一端//如果外键可以为null,则可以随意保存session.save(grade);session.save(stu);session.save(stu1);tx.commit();}catch(Exception e){if(tx!=null)tx.rollback();e.printStackTrace();}finally{HibernateUtil.closeSession();}}/** * 获取数据 */@Testpublic void testGet(){Session session=null;Transaction tx=null;try{session=HibernateUtil.getSession();tx=session.beginTransaction();Grade grade=(Grade) session.get(Grade.class, 1);System.out.println("gradeName="+grade.getName());System.out.println("grade所对应的多的一端的数据");Iterator<Student> iter=grade.getStudents().iterator();while(iter.hasNext()){Student stu=(Student)iter.next();System.out.println("学生name="+stu.getName());}tx.commit();}catch(Exception e){if(tx!=null)tx.rollback();e.printStackTrace();}finally{HibernateUtil.closeSession();}}}
执行testCreateDB控制台输出:





执行save控制台打印:

          

执行testGet控制台打印:


下面来看下双向一对多映射

与上面代码不同的是Student类增加了一个属性如下:

public class Student {private int id;private String name;private int age;private Grade grade;//省略get/set方法}
Student.hbm.xml配置文件也有改动,如下:

<hibernate-mapping package="com.test.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"/></class></hibernate-mapping>
注意:将Grade.hbm.xml配置文件里key里的not-null="true"去掉,否则会报错。




阅读全文
0 0
原创粉丝点击