1.实体类的一对多的关系映射

一个客户对应多个联系人

Customer.java

  1. public class Customer {
  2. private Long cust_id;
  3. private String cust_name;
  4. private String cust_source;
  5. private String cust_industry;
  6. private String cust_level;
  7. private String cust_phone;
  8. private String cust_mobile;
  9. // 通过ORM方式表示:一个客户对应多个联系人。
  10. // 放置的多的一方的集合。Hibernate默认使用的是Set集合。
  11. private Set<LinkMan> linkMans = new HashSet<LinkMan>();
  12. }

LinkMan.java

  1. public class LinkMan {
  2. private Long lkm_id;
  3. private String lkm_name;
  4. private String lkm_gender;
  5. private String lkm_phone;
  6. private String lkm_mobile;
  7. private String lkm_email;
  8. private String lkm_qq;
  9. private String lkm_position;
  10. private String lkm_memo;
  11. // 通过ORM方式表示:一个联系人只能属于某一个客户。
  12. // 放置的是一的一方的对象。
  13. private Customer customer;
  14. }

2.映射文件的一对多的关系映射

Customer.hbm.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  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. <hibernate-mapping>
  6. <class name="com.work.entity.Customer" table="cst_customer">
  7. <!-- 建立OID与主键映射 -->
  8. <id name="cust_id" column="cust_id">
  9. <generator class="native"/>
  10. </id>
  11. <!-- 建立普通属性与数据库表字段映射 -->
  12. <property name="cust_name" column="cust_name" />
  13. <property name="cust_source" column="cust_source"/>
  14. <property name="cust_industry" column="cust_industry"/>
  15. <property name="cust_level" column="cust_level"/>
  16. <property name="cust_phone" column="cust_phone"/>
  17. <property name="cust_mobile" column="cust_mobile"/>
  18. <!-- 配置一对多的映射:放置的多的一方的集合 -->
  19. <!--
  20. set标签 :
  21. * name :多的一方的对象集合的属性名称。
  22. * cascade:级联
  23. * inverse:放弃外键维护权。inverse="true"
  24. -->
  25. <set name="linkMans" cascade="save-update,delete">
  26. <!--
  27. key标签
  28. * column:多的一方的外键的名称。
  29. -->
  30. <key column="lkm_cust_id"/>
  31. <!--
  32. one-to-many标签
  33. * class :多的一方的类的全路径
  34. -->
  35. <one-to-many class="com.work.entity.LinkMan"/>
  36. </set>
  37. </class>
  38. </hibernate-mapping>

LinkMan.hbm.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  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. <hibernate-mapping>
  6. <class name="com.work.entity.LinkMan" table="cst_linkman">
  7. <!-- 建立OID与主键映射 -->
  8. <id name="lkm_id" column="lkm_id">
  9. <generator class="native"/>
  10. </id>
  11. <!-- 建立普通属性与表字段映射 -->
  12. <property name="lkm_name"/>
  13. <property name="lkm_gender"/>
  14. <property name="lkm_phone"/>
  15. <property name="lkm_mobile"/>
  16. <property name="lkm_email"/>
  17. <property name="lkm_qq"/>
  18. <property name="lkm_position"/>
  19. <property name="lkm_memo"/>
  20. <!-- 配置多对一的关系:放置的是一的一方的对象 -->
  21. <!--
  22. many-to-one标签
  23. * name :一的一方的对象的属性名称。
  24. * class :一的一方的类的全路径。
  25. * column :在多的一方的表的外键的名称。
  26. -->
  27. <many-to-one name="customer" cascade="save-update,delete" class="com.work.entity.Customer" column="lkm_cust_id"/>
  28. </class>
  29. </hibernate-mapping>

3.一对多的操作

1>保存一个客户,和客户下的两个联系人

  1. @Test
  2. public void saveOrUupdate() {
  3.  
  4. Session session = HibernateUtils.getCurrentSession();
  5. Transaction tx = session.beginTransaction();
  6.  
  7. Customer customer = new Customer();
  8. customer.setCust_name("xj");
  9.  
  10. LinkMan linkMan1 = new LinkMan();
  11. linkMan1.setLkm_name("hdh");
  12.  
  13. LinkMan linkMan2 = new LinkMan();
  14. linkMan1.setLkm_name("hdh");
  15.  
  16. customer.getLinkMans().add(linkMan1);
  17. customer.getLinkMans().add(linkMan2);
  18.  
  19. session.save(customer);
  20. session.save(linkMan1);
  21. session.save(linkMan2);
  22.  
  23. tx.commit();
  24.  
  25. }

2>通过级联进行保存一个客户,和客户下的两个联系人

级联操作: 级联指的是,操作一个对象的时候,会同时操作其关联的对象。

级联操作需要对进行操作的一方进行配置:cascade="save-update,delete"

  1. <set name="linkMans" cascade="save-update,delete" inverse="true">
  2. <!--
  3. key标签
  4. * column:多的一方的外键的名称。
  5. -->
  6. <key column="lkm_cust_id"/>
  7. <!--
  8. one-to-many标签
  9. * class :多的一方的类的全路径
  10. -->
  11. <one-to-many class="com.work.entity.LinkMan"/>
  12. </set>

通过级联操作只需要对一方进行更新

保存级联操作:保存客户客户对应的联系人也保存了

  1. @Test
  2. public void saveOrUupdate2() {
  3.  
  4. Session session = HibernateUtils.getCurrentSession();
  5. Transaction tx = session.beginTransaction();
  6.  
  7. Customer customer = new Customer();
  8. customer.setCust_name("lq");
  9.  
  10. LinkMan linkMan1 = new LinkMan();
  11. linkMan1.setLkm_name("hdh");
  12.  
  13. LinkMan linkMan2 = new LinkMan();
  14. linkMan2.setLkm_name("xj");
  15.  
  16. customer.getLinkMans().add(linkMan1);
  17. customer.getLinkMans().add(linkMan2);
  18.  
  19. //进行了级联操作 只需要更新一方
  20. session.save(customer);
  21.  
  22. tx.commit();
  23. }

删除级联操作:删除客户客户对应的联系人也删除了

  1. @Test
  2. public void delete() {
  3.  
  4. Session session = HibernateUtils.getCurrentSession();
  5. Transaction tx = session.beginTransaction();
  6.  
  7. Customer customer = session.get(Customer.class, 2L);
  8. session.delete(customer);
  9.  
  10. tx.commit();
  11.  
  12. }

更新级联操作

  1. @Test
  2. public void update() {
  3.  
  4. Session session = HibernateUtils.getCurrentSession();
  5. Transaction tx = session.beginTransaction();
  6.  
  7. //进行级联更新
  8. Customer customer = session.get(Customer.class, 3L);
  9. LinkMan linkMan = session.get(LinkMan.class, 5l);
  10.  
  11. //关联
  12. customer.getLinkMans().add(linkMan);
  13. linkMan.setCustomer(customer);
  14. session.update(customer);
  15. tx.commit();
  16.  
  17. }

4.cascade和inverse的区别

cascade:是控制关联的对象

inverse:是控制 一的一方是否有放弃外键的维护权

hibernate_03_hibernate一对多的关系映射的更多相关文章

  1. jeecg中一对多的关系映射

    1.首先看一张前端页面: 有一张主表和3张子表,显示这3张子表的代码如下 <t:tabs id="tt" iframe="false" tabPositi ...

  2. Hibernate_day03讲义_使用Hibernate完成一对多的关系映射并操作

  3. Mybatis框架中实现双向一对多关系映射

    学习过Hibernate框架的伙伴们很容易就能简单的配置各种映射关系(Hibernate框架的映射关系在我的blogs中也有详细的讲解),但是在Mybatis框架中我们又如何去实现 一对多的关系映射呢 ...

  4. Hibernate执行流程和关系映射

    一.Hibernate的执行流程 hibernate作为一个ORM框架,它封装了大量数据库底层的sql语句操作的方法,这样在执行hibernate的过程中理解hibernate的执行流程很有必要. 由 ...

  5. Mybatis对象关系映射 one2one,one2many,many2many

    MyBatis中的高级映射一般要借助select元素中的resultMap属性进行实现,通过此属性配置实现一对一,一对多等关系映射的实现 一对一映射:association 一对多映射:collect ...

  6. 菜鸟学习Hibernate——一对多关系映射

    Hibernate中的关系映射,最常见的关系映射之一就是一对多关系映射例如学生与班级的关系,一个班级对应多个学生.如图: Hibernate中如何来映射这两个的关系呢? 下面就为大家讲解一下: 1.创 ...

  7. hibernate对象关系映射( 一对一,一对多,多对一,多对多的单向,双向映射 ——)

    对象之间的关系: 关系映射之间的关系只的是对象之间的关系,并不指数据库表的关系(外键关系)这儿解决的问题是当对象之间的关系之一时,数据库表该如何映射,编程上如何对待. 一对一(主键关联,和单向的外键关 ...

  8. Hibernate学习笔记三:对象关系映射(一对一,一对多,多对一,多对多)

    如需转载,请说明出处:http://www.cnblogs.com/gudu1/p/6895610.html Hibernate通过关系映射来表示数据库中表与表之间的关系,关系映射可以通过两种方式:配 ...

  9. Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射

    1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; privat ...

随机推荐

  1. wbinfo - 向winbind服务查询信息

    总览 SYNOPSIS wbinfo [-a user%password] [-c username] [-C groupname] [--domain domain] [-I ip] [-s sid ...

  2. 目录文件的操作函数 mkdir ,opendir,readdir,closedir

    1.  int mkdir(const char *pathname, mode_t mode);   头文件 :<sys/stat.h>  <sys/types.h> 功能: ...

  3. JS对象 数组排序sort() sort()方法使数组中的元素按照一定的顺序排列。 语法: arrayObject.sort(方法函数)

    数组排序sort() sort()方法使数组中的元素按照一定的顺序排列. 语法: arrayObject.sort(方法函数) 参数说明: 1.如果不指定<方法函数>,则按unicode码 ...

  4. 从零开始搭建系统1.1——CentOs安装

    本篇主要是记录安装CentOs的过程,为什么会选择CentOs,没有过多的原因,主要是出于CentOs相对来说安装的人比较多, 以后有问题了方便查资料.本次安装是安装在一台笔记本上,WIN7+Cent ...

  5. 笔记47 Hibernate快速入门(四)

    Hibernate注解,完成原来xml文件里的映射信息. 使用注解时,要修改hibernate.cfg.xml中的映射,不再是通过xml文件 <mapping class="hiber ...

  6. Jenkins 搭建 .NET Core 持续集成环境

    关于c#的.Net FrameWork 的集成环境以及MsBuild的配置可以看     jenkins搭建.NET FrameWork持续集成环境 这篇文章     关于.NET Core 这个项目 ...

  7. 开放应用模型(OAM):全球首个云原生应用标准定义与架构模型

    Kubernetes 项目作为容器编排领域的事实标准, 成功推动了诸如阿里云 Kubernetes (ACK)等云原生服务的迅速增长.但同时我们也关注到,Kubernetes 的核心 API 资源比如 ...

  8. 10.RabbitMQ Fanout类型交换机

    Fanout类型交换机忽略Routing Key,它将消息传递到所有与它绑定的队列上.       Producer.java package com.test.fanout;   import co ...

  9. 数据结构C++版-栈

    一.概念 二.应用实例 1.进制转换 #include <stdlib.h> #include <iostream> #include <string> #incl ...

  10. centos7.5下coredns+etcd搭建DNS服务器

    coredns简介 安装etcd 安装coredns 设置域名解析 A记录 AAAA记录 CNAME记录 SRV记录 TXT记录 coredns简介 CoreDNS是一个DNS服务器,和Caddy S ...