前两节写了两个例子,分别是单向多对一的映射和单向一对多的映射,这一节继续以这个例子讲一下双向一对多的映射方法,如下图所示:

  很多时候,我们既想从一对端获取多对端的信息,又想从多对端获取一对端的数据,这就是需要双向一对多的映射关系,这也是最常见的表与表的映射关系,在hibernate中应当这样配置:

新建Studnet实体类:

  1. public class Student {
  2.  
  3. private int id;
  4. private String name;
  5. private String sex;
  6. private Grade grade;
  7. //get/set方法省略
  8. }

新建Grade实体类:

  1. public class Grade {
  2.  
  3. private int id;
  4. private String name;
  5. private String teacher;
  6. private Set<Student> students=new HashSet<Student>(0);
  7. //get/set方法省略
  8. }

当前包下新建Student的映射文件Student.hbm.xml:

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5.  
  6. <hibernate-mapping package="com.wang.pojo">
  7. <class name="Student" >
  8. <id name="id">
  9. <generator class="native"></generator>
  10. </id>
  11.  
  12. <property name="name"></property>
  13. <property name="sex"></property>
  14. <many-to-one name="grade" class="Grade" column="gradeId" not-null="true"></many-to-one>
  15. </class>
  16. </hibernate-mapping>

当前包下新建Grade的映射文件Grade.hbm.xml:

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5.  
  6. <hibernate-mapping package="com.wang.pojo">
  7. <class name="Grade" >
  8. <id name="id">
  9. <generator class="native"></generator>
  10. </id>
  11.  
  12. <property name="name"></property>
  13. <property name="teacher"></property>
  14. <!-- set是一种集合属性,可以配置set,list等,这里是Grade的集合属性 name是属性名称 -->
  15. <set name="students">
  16. <!-- key表示外键 column表示外键列名 注意在双向一对多的关系中,一对端即这里的Grade不需要设置notnull="true"-->
  17. <key column="gradeId" ></key>
  18. <one-to-many class="Student"/>
  19. </set>
  20. </class>
  21. </hibernate-mapping>

将两个映射文件添加到hibernate.cfg.xml中去,新建测试类,测试1:自动生成表结构2:存取数据3:读取数据(分别测试从Student一端读取,以及从grade一段读取):

  1. @Test
  2. public void testCreateDB() {
  3. Configuration cfg = new Configuration().configure();
  4. SchemaExport se = new SchemaExport(cfg);
  5. // 第一个参数是否生成ddl脚本 第二个参数是否执行到数据库
  6. se.create(true, true);
  7. }
  8.  
  9. @Test
  10. public void testSave() {
  11. Session session = HibernateUtil.getSession();
  12. Transaction tx = session.beginTransaction();
  13. // Score s=new Score(2,12,97);
  14. // session.save(s);
  15. Grade g=new Grade(1, "终极一班", "王大炮");
  16.  
  17. Student s1=new Student(12, "李云龙", "男", g);
  18. Student s2=new Student(13, "赵刚", "男", g);
  19.  
  20. session.save(g);
  21. session.save(s1);
  22. session.save(s2);
  23. tx.commit();
  24. session.close();
  25. }
  26. @Test
  27. public void testGet() {
  28. Session session = HibernateUtil.getSession();
  29. Transaction tx = session.beginTransaction();
  30. //从Grade一端获取数据
  31. Grade g=(Grade)session.get(Grade.class, 1);
  32. System.out.println("id="+g.getId()+"name="+g.getName()+"teacher="+g.getTeacher());
  33. Iterator<Student> it = g.getStudents().iterator();
  34. while(it.hasNext()){
  35. Student s=it.next();
  36. System.out.println(s);
  37. }
  38. //从Student一端获取数据
  39. Student s1=(Student)session.get(Student.class, 1);
  40. System.out.println(s1.getName()+"====="+s1.getGrade().getName());
  41. tx.commit();
  42. session.close();
  43. }

  总结:在双向一对多的映射关系中,注意一的一端(Grade)配置:<key>标签中不需要指定not-null="true";如果想要在一的一端(Grade)来维护关系,那么在多的一端(Student)不用指定关联列非空.

hibernate笔记--双向一对多映射方法的更多相关文章

  1. hibernate笔记--单向一对多映射方法

    上一篇讲的是单向多对一的表关系,与单向一对多的关系正好相反,如下图所示关系: ,可以看出年级表和学生表是一对多的关系,一条年级信息对应多条学生信息,在hibernate中成为单向的一对多的映射关系,应 ...

  2. hibernate笔记--组件映射方法

    假设我们需要保存学生student的信息,student中有一个address属性,我们知道像这种信息其值可能会有多个,就像一个人会有两个以上的手机号,这种情况在hibernate中应该这样配置: 新 ...

  3. 菜鸡的Java笔记 - java 双向一对多映射

    双向一对多映射    two-way    开发要求:        根据数据表的结构进行简单java类的转换:        要求实现如下的输出信息:            可以根据课程取得全部参与 ...

  4. 框架Hibernate笔记系列 基础Session

    标题:框架Hibernate笔记 资料地址: 1. www.icoolxue.com 孔浩 1.背景简介 Hibenate是JBoss公司的产品.它是数据持久化的框架.Usually,我们使用JDBC ...

  5. HIBERNATE一对一双向外键联合主键关联

    HIBERNATE一对一双向外键联合主键关联: 一. 创建主键类:这个主键必须实现serializedable接口和重写其中的hashCode方法和equals方法:为主键类添加一个叫做@Embedd ...

  6. 慕课网Hibernate初探之一对多映射实验及总结

    慕课网Hibernate初探之一对多映射实验及总结 一.本课核心 * 1.如何在MyEclipse中使用Hibernate * 2.如何实现Hibernate中一对多的映射 * 3.如何创建Sessi ...

  7. Java进阶知识07 Hibernate一对一双向外键关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.创建Husband类和Wife类 package com.shore.model; import javax.persistence.Entity; impo ...

  8. hibernate save,update,saveorupdate方法有什么区别

    save肯定是添加的时候用,update修改时候用,saveorupdate是添加或修改,如果真是这样save和update的存在就没意义了,我们直接saveorupdate就行了. save在添加用 ...

  9. Hibernate HQL的update方法详解

    虽然hibernate提供了许多方法对数据库进行更新,但是这的确不能满足开发需要.现在讲解一下用hql语句对数据进行更新. 不使用参数绑定格式String hql="update User ...

随机推荐

  1. php 用 http post方法传输数据

    private function http_post($url,$post,$timeout){ $curl = curl_init(); curl_setopt($curl, CURLOPT_URL ...

  2. 关于 iframe 在ie11 height:100% 无效的巨坑

    好的,今天公司分配了个解决ie中的bug的任务,其中,有一个就是iframe 的高度 100% 没有生效的问题: 一开始,由于我真的没有怎么去了解过iframe这个货,所以,网上各种搜索一大堆关于这货 ...

  3. Jquery学习插件之手风琴

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. oracle10g冷备份和恢复过程记录

    一.冷备份: 1.操作系统无法进入,需要利用启动盘进入winpe系统进行操作. 2.进入PE系统后,搜索所有盘符确认没有其它被作为oracle数据文件存放的目录,也就是说所有oracle有关的文件都存 ...

  5. dot

    今天写程序的时候发现一个问题啊 在主函数里面吧某个指针node* r=NULL 赋值为空 然后调用函数insert(node* r,....) 在insert里面呢,我给这个指针赋值了啊 但是主函数里 ...

  6. 从阿里巴巴IPO联想到创始人和资方关系

    [小九的学堂,致力于以平凡的语言描述不平凡的技术.如要转载,请注明来源:小九的学堂.cnblogs.com/xfuture] 5月7日,阿里巴巴于今日向美国证券交易委员会(SEC)提交了IPO(首次公 ...

  7. JSON与XML的区别比较

    1.定义介绍 (1).XML定义扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许 ...

  8. 先有 Mac 还是先有银元?

    自从开设了这个公众号以后,收到最多的问题是:听了 Mac 君的介绍,我也觉得 Mac 很好,可是穷屌丝一枚,真买不起,怎么破?前几天我在微博上说,读了我的书,就有 Mac 了.居然有读者来问:这是真的 ...

  9. 《Hive编程指南》—— 读后总结

    知识图谱

  10. PHP制作查询租房表

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...