hibernate的映射关系

一对多、多对一、一对一、多对多。

常用的是一对多和多对一。

在数据库中可以通过添加主外键的关联,表现一对多的关系;在hibernate中通过在一方持有多方的集合实现,即在“一”的一端中使用<set>元素表示持有“多”的一端对象。

下面实现一个增删改查的“一对多”demo:一个班级对应多个学生。

首先创建学生类Student

  1. package com.imooc.entity;
  2.  
  3. import java.io.Serializable;
  4.  
  5. public class Student implements Serializable {
  6.  
  7. private int sid;
  8. private String sname;
  9. private String sex;
  10. // 在多方定义一个一方的引用
  11. private Grade grade;
  12.  
  13. public int getSid() {
  14. return sid;
  15. }
  16. public void setSid(int sid) {
  17. this.sid = sid;
  18. }
  19. public String getSname() {
  20. return sname;
  21. }
  22. public void setSname(String sname) {
  23. this.sname = sname;
  24. }
  25. public String getSex() {
  26. return sex;
  27. }
  28. public void setSex(String sex) {
  29. this.sex = sex;
  30. }
  31. public Grade getGrade() {
  32. return grade;
  33. }
  34. public void setGrade(Grade grade) {
  35. this.grade = grade;
  36. }
  37.  
  38. public Student() {
  39. super();
  40. }
  41.  
  42. public Student(String sname, String sex) {
  43. super();
  44. this.sname = sname;
  45. this.sex = sex;
  46. }
  47.  
  48. }

创建班级类Grade

  1. package com.imooc.entity;
  2.  
  3. import java.io.Serializable;
  4. import java.util.HashSet;
  5. import java.util.Set;
  6.  
  7. public class Grade implements Serializable {
  8.  
  9. private int gid;
  10. private String gname;
  11. private String gdesc;
  12. private Set<Student> students = new HashSet<Student>();
  13.  
  14. public int getGid() {
  15. return gid;
  16. }
  17. public void setGid(int gid) {
  18. this.gid = gid;
  19. }
  20. public String getGname() {
  21. return gname;
  22. }
  23. public void setGname(String gname) {
  24. this.gname = gname;
  25. }
  26. public String getGdesc() {
  27. return gdesc;
  28. }
  29. public void setGdesc(String gdesc) {
  30. this.gdesc = gdesc;
  31. }
  32. public Set<Student> getStudents() {
  33. return students;
  34. }
  35. public void setStudents(Set<Student> students) {
  36. this.students = students;
  37. }
  38.  
  39. public Grade() {
  40. super();
  41. }
  42.  
  43. public Grade(int gid, String gname, String gdesc) {
  44. super();
  45. this.gid = gid;
  46. this.gname = gname;
  47. this.gdesc = gdesc;
  48. }
  49.  
  50. public Grade(String gname, String gdesc) {
  51. super();
  52. this.gname = gname;
  53. this.gdesc = gdesc;
  54. }
  55. }

创建Student类的映射文件Student.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4. <!-- Generated 2017-6-1 14:49:09 by Hibernate Tools 3.5.0.Final -->
  5. <hibernate-mapping>
  6. <class name="com.imooc.entity.Student" table="STUDENT">
  7. <id name="sid" type="int">
  8. <column name="SID" />
  9. <generator class="increment" />
  10. </id>
  11. <property name="sname" type="java.lang.String">
  12. <column name="SNAME" />
  13. </property>
  14. <property name="sex" type="java.lang.String">
  15. <column name="SEX" />
  16. </property>
  17. </class>
  18. </hibernate-mapping>

创建Grade类的映射文件Grade.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4. <!-- Generated 2017-6-1 14:49:09 by Hibernate Tools 3.5.0.Final -->
  5. <hibernate-mapping>
  6. <class name="com.imooc.entity.Grade" table="GRADE">
  7. <id name="gid" type="int">
  8. <column name="GID" />
  9. <generator class="increment" />
  10. </id>
  11. <property name="gname" type="java.lang.String">
  12. <column name="GNAME" length="20" not-null="true" />
  13. </property>
  14. <property name="gdesc" type="java.lang.String">
  15. <column name="GDESC" />
  16. </property>
  17. <!-- 指定关联的外键列 -->
  18. <set name="students" table="STUDENT">
  19. <key>
  20. <column name="GID" />
  21. </key>
  22. <one-to-many class="com.imooc.entity.Student" />
  23. </set>
  24. </class>
  25. </hibernate-mapping>

创建hibernate的配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6. <session-factory>
  7. <property name="connection.username">root</property>
  8. <property name="connection.password">root</property>
  9. <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
  10. <property name="connection.url">
  11. <![CDATA[
  12. jdbc:mysql://localhost:3306/hibernate?useUnicode=true&amp;characterEncoding=UTF-8
  13. ]]>
  14. </property>
  15. <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
  16. <property name="show_sql">true</property>
  17. <property name="format_sql">true</property>
  18. <property name="hbm2ddl.auto">update</property>
  19.  
  20. <!-- 指定映射文件的路径 -->
  21. <mapping resource="com/imooc/entity/Grade.hbm.xml" />
  22. <mapping resource="com/imooc/entity/Student.hbm.xml" />
  23. </session-factory>
  24. </hibernate-configuration>

写一个增删改查的测试文件

  1. package com.imooc.test;
  2.  
  3. import java.util.Set;
  4.  
  5. import org.hibernate.Session;
  6. import org.hibernate.Transaction;
  7.  
  8. import com.imooc.entity.Grade;
  9. import com.imooc.entity.Student;
  10. import com.imooc.util.HibernateUtil;
  11.  
  12. /*
  13. * 单向一对多关系关系(班级--->学生)
  14. * 建立关联关系后,可以方便的从一个对象导航到另一个对象
  15. * 注意关联的方向
  16. */
  17. public class Test01 {
  18.  
  19. public static void main(String[] args) {
  20. //add();
  21. //findStudentsByGrade();
  22. //update();
  23. delete();
  24. }
  25.  
  26. //将学生添加到班级
  27. public static void add() {
  28. Grade g = new Grade("Java一班", "Java软件开发一班");
  29. Student s1 = new Student("杨康", "男");
  30. Student s2 = new Student("穆念慈", "女");
  31.  
  32. //如果希望在学生表中添加对应的班级编号,需要在班级中添加学生,建立关联关系
  33. g.getStudents().add(s1);
  34. g.getStudents().add(s2);
  35.  
  36. Session session = HibernateUtil.getSession();
  37. Transaction tr = session.beginTransaction();
  38. session.save(g);
  39. session.save(s1);
  40. session.save(s2);
  41. tr.commit();
  42. HibernateUtil.closeSession(session);
  43. }
  44.  
  45. //查询班级中包含的学生
  46. public static void findStudentsByGrade() {
  47. Session session = HibernateUtil.getSession();
  48. Grade grade = (Grade) session.get(Grade.class, 1);
  49. System.out.println( grade.getGname() + "," + grade.getGdesc() );
  50.  
  51. Set<Student> students = grade.getStudents();
  52. for(Student s : students) {
  53. System.out.println( s.getSname() + "," + s.getSex() );
  54. }
  55. }
  56.  
  57. //修改学生信息
  58. public static void update() {
  59. Grade g=new Grade("Java二班", "Java软件开发二班");
  60. Session session = HibernateUtil.getSession();
  61. Transaction tr = session.beginTransaction();
  62. Student s = (Student) session.get(Student.class, 1);
  63. g.getStudents().add(s);
  64. session.save(g);
  65. tr.commit();
  66. HibernateUtil.closeSession(session);
  67. }
  68.  
  69. //删除学生信息
  70. public static void delete() {
  71. Session session = HibernateUtil.getSession();
  72. Transaction tr = session.beginTransaction();
  73. Student s = (Student) session.get(Student.class, 2);
  74. session.delete(s);
  75. tr.commit();
  76. HibernateUtil.closeSession(session);
  77. }
  78. }

hibernate_08_关联映射_一对多的更多相关文章

  1. 009一对一 主键关联映射_单向(one-to-one)

    009一对一  主键关联映射_单向(one-to-one) ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个 ...

  2. (转)MyBatis框架的学习(五)——一对一关联映射和一对多关联映射

    http://blog.csdn.net/yerenyuan_pku/article/details/71894172 在实际开发中我们不可能只是对单表进行操作,必然要操作多表,本文就来讲解多表操作中 ...

  3. 【Hibernate框架】关联映射(一对多,多对一)

    根据我们的总结计划,上篇文章我们总结了有关于一对一映射相关知识,接下来,我们进行下一个阶段,一对多.多对一映射相关知识. 场景设定: 国家规定,一个人只能在一个公司上班,一个公司可以拥有很多员工.我们 ...

  4. Hibernate框架--关联映射,一对多,多对多 inverse cascade

    回顾Hibernate: 1. hibernate开发环境搭建 ----> 引入jar: hibernate.jar + required + jpa + 驱动包 ---> hiberna ...

  5. Hibernate关联映射(一对多/多对多)

    版权声明:翀版 https://blog.csdn.net/biggerchong/article/details/843401053.  Hibernate关联映射上接Hibernate持久化类:h ...

  6. 012一对一 唯一外键关联映射_双向(one-to-one)

    ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...

  7. 011一对一 唯一外键关联映射_单向(one-to-one)

    ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...

  8. 010一对一 主键关联映射_双向(one-to-one)

    ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...

  9. mybatis_10关联查询_一对多

    在使用mybatis框架的时候,很多时候需要一个查询结果里的属性包含多个对象,即一条查询结果有属性是集合,这个时候就需要使用collection标签 模型里面有集合 案例: 第一步:在Orders中添 ...

随机推荐

  1. 4.几个「不难但却很有用」的 Git 技能点

    阅读 Git 原理详解及实用指南 记录 tag:不可移动的 branch tag 是一个和 branch 非常相似的概念,它和 branch 最大的区别是:tag 不能移动.所以在很多团队中,tag ...

  2. svn 使用TortoiseSVN server搭建本地SVN服务器

    使用TortoiseSVN server搭建本地SVN服务器

  3. LeetCode 712. Minimum ASCII Delete Sum for Two Strings

    Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal. ...

  4. 该页必须使用安全性较高的Web 浏览器查看

    当用https访问某个网站时,IE提醒“该页必须使用安全性较高的Web 浏览器查看” 您要访问的资源使用了128位版本的“安全套接层(SSL)” 安全保护.要查看该资源,您需要使用支持该版本的SSL浏 ...

  5. 【codeforces 767B】The Queue

    [题目链接]:http://codeforces.com/contest/767/problem/B [题意] 排队去办护照; 给你n个人何时来的信息; 然后问你应该何时去才能在队伍中等待的时间最短; ...

  6. mysql-sql语句中变量的使用

    最近工作中用到mysql,发现mysql和Oracle差别挺大的,其不像Oracle中存在丰富的分析函数(开窗函数),如rank(),lag(),leaf()等,只能用变量来获取以便达到分析函数的效果 ...

  7. 通过urllib2抓取网页内容(1)

    一.urllib2发送请求 import urllib2 url = 'http://www.baidu.com' req = urllib2.Request(url) response = urll ...

  8. CF #324 DIV2 C题

    #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...

  9. swift 雨燕 新手教程

    Apple Swift编程语言新手教程 chox 2014-06-03 文件夹 简单介绍 入门 简单值 控制流 函数与闭包 对象与类 枚举与结构 1   简单介绍 今天凌晨Apple刚刚公布了Swif ...

  10. 通过buildpath 导入jar和在lib下导入的jar包区别

    jar包放置在WEB-INF/lib下和通过build path导入的区别是什么? jar包直接拷贝到WEB-INF/lib下和以userLibrary形式引入的区别? jar包放置在WEB-INF/ ...