映射原理
       一对多关联映射和多对一关联映射的映射原理是一样一样的,所以说嘛,知识都是相通的,一通百通,为什么说一对多关联映射和多对一关联映射是一样的呢?因为她们都是在多的一端加入一个外键,指向一的一段,关联关系都是在多的一端进行维护,只是我们在写映射的时候发生了变化。
       一对多和多对一的映射原理是一样的,但是她们之间也存在着小小的区别,毕竟世界上没有两片完全相同的叶子,她们之间的区别就是维护的关系不同,我们先来看多对一,多端维护一端的关系,在加载多端的时候,可以将一端加载上来;一对多,一端维护多端的关系,在加载一端的时候,可以将多端加载上来。一对多关联映射也存在两种策略,单向和双向,今天这篇博文,小编就来简单的介绍一下一对多关联映射,希望对有需要的小伙伴有帮助,不足之处,还请小伙伴们多多指教`(*∩_∩*)′。

       一对多单向关联映射

我们都知道,一个班级是由多个学生组成的,ok,今天的故事就从班级和学生开始拉开帷幕,我们依然从uml入手,首先我们来看对象模型,如下图所示:

从对象模型中,我们可以看出,Classes持有Student的一个引用,由于是单向关联,所以数据在加载Classes的时候,会把Student加载上来,但是Student并不知道Classes的存在。接着,我们开始来编写代码的部分。
第一步、编写实体Classes && Student,代码如下所示,首先我们来编写Classes,代码如下所示:

  1. package com.bjpowernode.hibernate;
  2. import java.util.Set;
  3.  
  4. public class Classes {
  5.  
  6. private int id;
  7. private String name;
  8. private Set Students;
  9. public int getId() {
  10. return id;
  11. }
  12. public void setId(int id) {
  13. this.id = id;
  14. }
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21. public Set getStudents() {
  22. return Students;
  23. }
  24. public void setStudents(Set students) {
  25. Students = students;
  26. }

Student的代码如下所示:

  1. package com.bjpowernode.hibernate;
  2.  
  3. public class Student {
  4.  
  5. private int id;
  6. private String name;
  7. public int getId() {
  8. return id;
  9. }
  10. public void setId(int id) {
  11. this.id = id;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19.  
  20. }

第二步、编写映射文件,首先编写Classes.hbm.xml代码如下所示:

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="com.bjpowernode.hibernate.Classes" table="t_classes">
  7.  
  8. <id name="id">
  9. <generator class="native"/>
  10. </id>
  11. <property name="name"/>
  12. <set name = "students">
  13.  
  14. <key column="classesid"/>
  15. <one-to-many class="com.bjpowernode.hibernate.Student"/>
  16.  
  17. </set>
  18. </class>
  19.  
  20. </hibernate-mapping>

接着编写Student.hbm.xml的代码,如下所示:

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name ="com.bjpowernode.hibernate.Student" table="t_student">
  7. <id name="id">
  8. <generator class="native"/>
  9.  
  10. </id>
  11. <property name="name"/>
  12.  
  13. </class>
  14.  
  15. </hibernate-mapping>

第三步、编写hibernate.cfg.xml的代码,建立数据库并且添加相应的映射,代码如下所示:

  1. <!DOCTYPE hibernate-configuration PUBLIC
  2. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  4.  
  5. <hibernate-configuration>
  6. <session-factory >
  7. <!-- MySql数据库驱动 -->
  8. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  9. <!-- 数据库名称 -->
  10. <property name="hibernate.connection.url"> jdbc:mysql:///hibernate_one2many_1</property>
  11. <!-- 数据库的用户名 -->
  12. <property name="hibernate.connection.username">root</property>
  13. <!-- 数据库的密码 -->
  14. <property name="hibernate.connection.password">123456</property>
  15. <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  16. <!-- 显示语句 -->
  17. <property name="hibernate.show_sql">true</property>
  18. <!-- 格式排版 -->
  19. <!-- <property name="hibernate.format_sql">true</property> -->
  20.  
  21. <mapping resource="com/bjpowernode/hibernate/Student.hbm.xml"/>
  22. <mapping resource="com/bjpowernode/hibernate/Classes.hbm.xml"/>
  23. </session-factory>
  24.  
  25. </hibernate-configuration>

接着创建数据库,并且运行ExportDB,生成相应的表结构如下所示:

      接着,我们向表里面插入数据,代码如下所示:

  1. package com.bjpowernode.hibernate;
  2.  
  3. import java.util.HashSet;
  4. import java.util.Set;
  5. import junit.framework.TestCase;
  6. import org.hibernate.Session;
  7. public void testSave2() {
  8. Session session = null;
  9. try {
  10. session = HibernateUtils.getSession();
  11. session.beginTransaction();
  12. Student student1 = new Student();
  13. student1.setName("张三");
  14. session.save(student1);
  15.  
  16. Student student2 = new Student();
  17. student2.setName("李四");
  18. session.save(student2);
  19.  
  20. Classes classes = new Classes();
  21. classes.setName("动力节点");
  22.  
  23. Set students = new HashSet();
  24. students.add(student1);
  25. students.add(student2);
  26. classes.setStudents(students);
  27.  
  28. //可以成功保存数据
  29. //但是会发出多余的update语句来维持关系
  30. session.save(classes);
  31. session.getTransaction().commit();
  32. }catch(Exception e) {
  33. e.printStackTrace();
  34. session.getTransaction().rollback();
  35. }finally {
  36. HibernateUtils.closeSession(session);
  37. }
  38. }

运行代码效果如下所示:

从上面的demo实例我们可以看出来,因为多端Student不知道Classes的存在,也就是Student不维护与Classes的关系,所以在保存Student的时候,字段classesid为空,如果该字段设置为非空,则将无法保存数据;因为Student不维护关系,而Classes维护关系,Classes将会发出多余的update语句。介绍完了一对多单向关联映射,接着我们来一起学习一下一对多双向关联映射,对象模型如下所示:

    双向关联映射

双向关联映射对比单向关联映射,对象的加载方向由单向变成了双向。我们依然以为Classes和Student为例进行讲解。
       第一步、编写实体Classes && Student,代码如下所示,首先我们来编写Classes,代码如下所示:

  1. package com.bjpowernode.hibernate;
  2.  
  3. import java.util.Set;
  4.  
  5. public class Classes {
  6.  
  7. private int id;
  8. private String name;
  9. private Set Students;
  10. public int getId() {
  11. return id;
  12. }
  13. public void setId(int id) {
  14. this.id = id;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. public Set getStudents() {
  23. return Students;
  24. }
  25. public void setStudents(Set students) {
  26. Students = students;
  27. }
  28.  
  29. }

接着,编写Student的代码,如下所示:       

  1. package com.bjpowernode.hibernate;
  2.  
  3. public class Student {
  4.  
  5. private int id;
  6. private String name;
  7. private Classes classes;
  8.  
  9. public Classes getClasses() {
  10. return classes;
  11. }
  12. public void setClasses(Classes classes) {
  13. this.classes = classes;
  14. }
  15. public int getId() {
  16. return id;
  17. }
  18. public void setId(int id) {
  19. this.id = id;
  20. }
  21. public String getName() {
  22. return name;
  23. }
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27.  
  28. }

第二步、编写映射文件,首先编写Classes.hbm.xml代码如下所示:

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="com.bjpowernode.hibernate.Classes" table="t_classes">
  7.  
  8. <id name="id">
  9. <generator class="native"/>
  10. </id>
  11. <property name="name"/>
  12. <set name = "students">
  13. <key column="classesid"/>
  14. <one-to-many class="com.bjpowernode.hibernate.Student"/>
  15.  
  16. </set>
  17. </class>

接着编写Student.hbm.xml的代码,如下所示:

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name ="com.bjpowernode.hibernate.Student" table="t_student">
  7. <id name="id">
  8. <generator class="native"/>
  9.  
  10. </id>
  11. <property name="name"/>
  12. <many-to-one name="classes" column="classesid"/>
  13.  
  14. </class>
  15.  
  16. </hibernate-mapping>

第三步、编写hibernate.cfg.xml的代码,建立数据库并且添加相应的映射,代码如下所示:

  1. <!DOCTYPE hibernate-configuration PUBLIC
  2. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  4.  
  5. <hibernate-configuration>
  6. <session-factory >
  7. <!-- MySql数据库驱动 -->
  8. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  9. <!-- 数据库名称 -->
  10. <property name="hibernate.connection.url"> jdbc:mysql:///hibernate_one2many_2</property>
  11. <!-- 数据库的用户名 -->
  12. <property name="hibernate.connection.username">root</property>
  13. <!-- 数据库的密码 -->
  14. <property name="hibernate.connection.password">123456</property>
  15. <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  16. <!-- 显示语句 -->
  17. <property name="hibernate.show_sql">true</property>
  18. <!-- 格式排版 -->
  19. <!-- <property name="hibernate.format_sql">true</property> -->
  20.  
  21. <mapping resource="com/bjpowernode/hibernate/Student.hbm.xml"/>
  22. <mapping resource="com/bjpowernode/hibernate/Classes.hbm.xml"/>
  23. </session-factory>
  24. </hibernate-configuration>

接着创建数据库,并且运行ExportDB,生成相应的表结构如下所示:

接着,我们向表里面插入数据,代码如下所示:

  1. package com.bjpowernode.hibernate;
  2. import java.util.HashSet;
  3. import java.util.Set;
  4. import junit.framework.TestCase;
  5. import org.hibernate.Session;
  6. public void testSave2() {
  7. Session session = null;
  8. try {
  9. session = HibernateUtils.getSession();
  10. session.beginTransaction();
  11. Student student1 = new Student();
  12. student1.setName("张三");
  13. session.save(student1);
  14.  
  15. Student student2 = new Student();
  16. student2.setName("李四");
  17. session.save(student2);
  18.  
  19. Classes classes = new Classes();
  20. classes.setName("动力节点");
  21.  
  22. Set students = new HashSet();
  23. students.add(student1);
  24. students.add(student2);
  25. classes.setStudents(students);
  26.  
  27. //可以成功保存数据
  28. //但是会发出多余的update语句来维持关系
  29. session.save(classes);
  30. session.getTransaction().commit();
  31. }catch(Exception e) {
  32. e.printStackTrace();
  33. session.getTransaction().rollback();
  34. }finally {
  35. HibernateUtils.closeSession(session);
  36. }
  37.  
  38. }

运行代码,效果如下所示:

       小编寄语:为什么多对一关联映射不存在单向一对多中的问题呢?在多对一关联映射里面,由于关系是在多的一端进行维护的,加载的时候从多的一端进行加载,当然没有问题。总结一下:在多对一关联映射中,如果用到,经常采用双向的方式来完成映射,弥补单向加载时的问题。ok,今天的hibernate一对多映射就介绍到这里,还请小伙伴们多多指教,在下一篇博文中,小编将继续介绍hibernate映射的相关知识,敬请期待……

【SSH系列】Hibernate映射 -- 一对多关联映射的更多相关文章

  1. 【SSH进阶之路】Hibernate映射——一对多关联映射(七)

    上上篇博文[SSH进阶之路]Hibernate映射——一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份 ...

  2. (Hibernate进阶)Hibernate映射——一对多关联映射(七)

    一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端.关联关系都是由多端维护,只是在写映射时发生了变化. 多对一和一对多的区别 多对一和 ...

  3. 【SSH进阶之路】Hibernate映射——多对多关联映射(八)

    上篇博文[SSH进阶之路]Hibernate映射——一对多关联映射(七),我们介绍了一对多关联映射,它是多对多关联映射的基础. 多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接 ...

  4. hihernate一对多关联映射

    hihernate一对多关联映射 一对多关联映射利用了多对一关联映射原理 多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一 一对多关联映射:在多的一端加入一个外键指向一的一端 ...

  5. 【SSH系列】Hibernate映射 -- 多对多关联映射

         映射原理 在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论 ...

  6. 【SSH系列】hibernate映射 -- 一对一双向关联映射

    开篇前言 上篇博文[SSH进阶之路]hibernate映射--一对一单向关联映射,小编介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身 ...

  7. 【SSH系列】Hibernate映射 -- 一对一单向关联映射

     映射原理       一对一关联映射:两个实体对象之间是一对一的关联映射,即一个对象只能与另外唯一的一个对象相对应.有两种策略可以实现一对一的关联映射:       a.主键关联:即让两个对象具有相 ...

  8. 【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)

    上篇博文[SSH进阶之路]Hibernate映射--一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指仅仅能从人(Person)这端载入身份证端(IdCard),可是反过来.不能从身份 ...

  9. 【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)

    [SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,採用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例 ...

随机推荐

  1. 福利:100G Java全套学习视频免费送了

    嗯 是的 众所周知 java工会自开办以来 一直致力于分享一些 java技术总结 学习方法..等等等 所以 从我做这个公众号以来 我的手机就没有消停过一天 因为 每天都有很多粉丝问我 "您好 ...

  2. oracle11g中SQL优化(SQL TUNING)新特性之SQL Plan Management(SPM)

    1.   简介 Oracle Database11gR1引进了SQL PlanManagement(简称SPM),一套允许DBA捕获和保持任意SQL语句执行计划最优的新工具,这样,限制了刷新优化器统计 ...

  3. Caffe的运行mnist手写数字识别

    老规矩,首先附上官方教程:http://caffe.berkeleyvision.org/gathered/examples/mnist.html 1.必要软件 因为Caffe中使用的是Linux才能 ...

  4. [Awson原创]修水渠(canal)

    Description Awson是某国际学校信竞组的一只菜鸡.他们班主任F老师喜欢带他们去爬爬唷喽山.登顶后,Awson有了个奇怪的发现. 山腰上有N(1<=N<=100)个村庄,这些村 ...

  5. ●线段树的三个题(poj 3225,hdu 1542,hdu 1828)

    ●poj 3225 Help with Intervals(线段树区间问题) ○赘述题目 给出以下集合操作: 然后有初始的一个空集S,和以下题目给出的操作指令,并输入指令: 要求进行指令操作后,按格式 ...

  6. ●BOZJ 2127 happiness

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2127 题解: 和 BZOJ 3984 建图类似(最小割模型).但是这个建图方法效率有点低.另 ...

  7. 网络基础-再议TCP

    以前只是知道3次握手和4次挥手,但是对于其在连接和断开时的各个状态却不是很懂,今天就来看一下握手和挥手时的状态转换图: 1.三次握手和四次挥手时的状态转换图: 实线表示应用程序: 应用层首先发SYN的 ...

  8. 51Nod 1530 稳定方块

    瓦西亚和皮台亚摆放了m个方块.方块被编号为0到m-1(每个号码出现恰好一次).现在建立一个座标系OX表示地面,OY的方向是竖直向上的.每一方块的左下角有一个座标而且是整点座标. 摆放好的方块一定要是稳 ...

  9. bzoj3223Tyvj 1729 文艺平衡树 splay

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5644  Solved: 3362[Submit][Sta ...

  10. 毕业设计-JSP论文盲审系统

    之前做的一款jsp的论文盲审系统,ssh框架的,学生提交论文,系统管理员将论文分配给教员,教员在不知学员是谁的情况之下,对论文进行打分,然后提交给系统,最后系统发布成绩,供学员查看. 整体做的还不错, ...