hibernate_03_hibernate一对多的关系映射
1.实体类的一对多的关系映射
一个客户对应多个联系人
Customer.java
- public class Customer {
- private Long cust_id;
- private String cust_name;
- private String cust_source;
- private String cust_industry;
- private String cust_level;
- private String cust_phone;
- private String cust_mobile;
- // 通过ORM方式表示:一个客户对应多个联系人。
- // 放置的多的一方的集合。Hibernate默认使用的是Set集合。
- private Set<LinkMan> linkMans = new HashSet<LinkMan>();
- }
LinkMan.java
- public class LinkMan {
- private Long lkm_id;
- private String lkm_name;
- private String lkm_gender;
- private String lkm_phone;
- private String lkm_mobile;
- private String lkm_email;
- private String lkm_qq;
- private String lkm_position;
- private String lkm_memo;
- // 通过ORM方式表示:一个联系人只能属于某一个客户。
- // 放置的是一的一方的对象。
- private Customer customer;
- }
2.映射文件的一对多的关系映射
Customer.hbm.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.work.entity.Customer" table="cst_customer">
- <!-- 建立OID与主键映射 -->
- <id name="cust_id" column="cust_id">
- <generator class="native"/>
- </id>
- <!-- 建立普通属性与数据库表字段映射 -->
- <property name="cust_name" column="cust_name" />
- <property name="cust_source" column="cust_source"/>
- <property name="cust_industry" column="cust_industry"/>
- <property name="cust_level" column="cust_level"/>
- <property name="cust_phone" column="cust_phone"/>
- <property name="cust_mobile" column="cust_mobile"/>
- <!-- 配置一对多的映射:放置的多的一方的集合 -->
- <!--
- set标签 :
- * name :多的一方的对象集合的属性名称。
- * cascade:级联
- * inverse:放弃外键维护权。inverse="true"
- -->
- <set name="linkMans" cascade="save-update,delete">
- <!--
- key标签
- * column:多的一方的外键的名称。
- -->
- <key column="lkm_cust_id"/>
- <!--
- one-to-many标签
- * class :多的一方的类的全路径
- -->
- <one-to-many class="com.work.entity.LinkMan"/>
- </set>
- </class>
- </hibernate-mapping>
LinkMan.hbm.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.work.entity.LinkMan" table="cst_linkman">
- <!-- 建立OID与主键映射 -->
- <id name="lkm_id" column="lkm_id">
- <generator class="native"/>
- </id>
- <!-- 建立普通属性与表字段映射 -->
- <property name="lkm_name"/>
- <property name="lkm_gender"/>
- <property name="lkm_phone"/>
- <property name="lkm_mobile"/>
- <property name="lkm_email"/>
- <property name="lkm_qq"/>
- <property name="lkm_position"/>
- <property name="lkm_memo"/>
- <!-- 配置多对一的关系:放置的是一的一方的对象 -->
- <!--
- many-to-one标签
- * name :一的一方的对象的属性名称。
- * class :一的一方的类的全路径。
- * column :在多的一方的表的外键的名称。
- -->
- <many-to-one name="customer" cascade="save-update,delete" class="com.work.entity.Customer" column="lkm_cust_id"/>
- </class>
- </hibernate-mapping>
3.一对多的操作
1>保存一个客户,和客户下的两个联系人
- @Test
- public void saveOrUupdate() {
- Session session = HibernateUtils.getCurrentSession();
- Transaction tx = session.beginTransaction();
- Customer customer = new Customer();
- customer.setCust_name("xj");
- LinkMan linkMan1 = new LinkMan();
- linkMan1.setLkm_name("hdh");
- LinkMan linkMan2 = new LinkMan();
- linkMan1.setLkm_name("hdh");
- customer.getLinkMans().add(linkMan1);
- customer.getLinkMans().add(linkMan2);
- session.save(customer);
- session.save(linkMan1);
- session.save(linkMan2);
- tx.commit();
- }
2>通过级联进行保存一个客户,和客户下的两个联系人
级联操作: 级联指的是,操作一个对象的时候,会同时操作其关联的对象。
级联操作需要对进行操作的一方进行配置:cascade="save-update,delete"
- <set name="linkMans" cascade="save-update,delete" inverse="true">
- <!--
- key标签
- * column:多的一方的外键的名称。
- -->
- <key column="lkm_cust_id"/>
- <!--
- one-to-many标签
- * class :多的一方的类的全路径
- -->
- <one-to-many class="com.work.entity.LinkMan"/>
- </set>
通过级联操作只需要对一方进行更新
保存级联操作:保存客户客户对应的联系人也保存了
- @Test
- public void saveOrUupdate2() {
- Session session = HibernateUtils.getCurrentSession();
- Transaction tx = session.beginTransaction();
- Customer customer = new Customer();
- customer.setCust_name("lq");
- LinkMan linkMan1 = new LinkMan();
- linkMan1.setLkm_name("hdh");
- LinkMan linkMan2 = new LinkMan();
- linkMan2.setLkm_name("xj");
- customer.getLinkMans().add(linkMan1);
- customer.getLinkMans().add(linkMan2);
- //进行了级联操作 只需要更新一方
- session.save(customer);
- tx.commit();
- }
删除级联操作:删除客户客户对应的联系人也删除了
- @Test
- public void delete() {
- Session session = HibernateUtils.getCurrentSession();
- Transaction tx = session.beginTransaction();
- Customer customer = session.get(Customer.class, 2L);
- session.delete(customer);
- tx.commit();
- }
更新级联操作
- @Test
- public void update() {
- Session session = HibernateUtils.getCurrentSession();
- Transaction tx = session.beginTransaction();
- //进行级联更新
- Customer customer = session.get(Customer.class, 3L);
- LinkMan linkMan = session.get(LinkMan.class, 5l);
- //关联
- customer.getLinkMans().add(linkMan);
- linkMan.setCustomer(customer);
- session.update(customer);
- tx.commit();
- }
4.cascade和inverse的区别
cascade:是控制关联的对象
inverse:是控制 一的一方是否有放弃外键的维护权
hibernate_03_hibernate一对多的关系映射的更多相关文章
- jeecg中一对多的关系映射
1.首先看一张前端页面: 有一张主表和3张子表,显示这3张子表的代码如下 <t:tabs id="tt" iframe="false" tabPositi ...
- Hibernate_day03讲义_使用Hibernate完成一对多的关系映射并操作
- Mybatis框架中实现双向一对多关系映射
学习过Hibernate框架的伙伴们很容易就能简单的配置各种映射关系(Hibernate框架的映射关系在我的blogs中也有详细的讲解),但是在Mybatis框架中我们又如何去实现 一对多的关系映射呢 ...
- Hibernate执行流程和关系映射
一.Hibernate的执行流程 hibernate作为一个ORM框架,它封装了大量数据库底层的sql语句操作的方法,这样在执行hibernate的过程中理解hibernate的执行流程很有必要. 由 ...
- Mybatis对象关系映射 one2one,one2many,many2many
MyBatis中的高级映射一般要借助select元素中的resultMap属性进行实现,通过此属性配置实现一对一,一对多等关系映射的实现 一对一映射:association 一对多映射:collect ...
- 菜鸟学习Hibernate——一对多关系映射
Hibernate中的关系映射,最常见的关系映射之一就是一对多关系映射例如学生与班级的关系,一个班级对应多个学生.如图: Hibernate中如何来映射这两个的关系呢? 下面就为大家讲解一下: 1.创 ...
- hibernate对象关系映射( 一对一,一对多,多对一,多对多的单向,双向映射 ——)
对象之间的关系: 关系映射之间的关系只的是对象之间的关系,并不指数据库表的关系(外键关系)这儿解决的问题是当对象之间的关系之一时,数据库表该如何映射,编程上如何对待. 一对一(主键关联,和单向的外键关 ...
- Hibernate学习笔记三:对象关系映射(一对一,一对多,多对一,多对多)
如需转载,请说明出处:http://www.cnblogs.com/gudu1/p/6895610.html Hibernate通过关系映射来表示数据库中表与表之间的关系,关系映射可以通过两种方式:配 ...
- Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射
1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; privat ...
随机推荐
- wbinfo - 向winbind服务查询信息
总览 SYNOPSIS wbinfo [-a user%password] [-c username] [-C groupname] [--domain domain] [-I ip] [-s sid ...
- 目录文件的操作函数 mkdir ,opendir,readdir,closedir
1. int mkdir(const char *pathname, mode_t mode); 头文件 :<sys/stat.h> <sys/types.h> 功能: ...
- JS对象 数组排序sort() sort()方法使数组中的元素按照一定的顺序排列。 语法: arrayObject.sort(方法函数)
数组排序sort() sort()方法使数组中的元素按照一定的顺序排列. 语法: arrayObject.sort(方法函数) 参数说明: 1.如果不指定<方法函数>,则按unicode码 ...
- 从零开始搭建系统1.1——CentOs安装
本篇主要是记录安装CentOs的过程,为什么会选择CentOs,没有过多的原因,主要是出于CentOs相对来说安装的人比较多, 以后有问题了方便查资料.本次安装是安装在一台笔记本上,WIN7+Cent ...
- 笔记47 Hibernate快速入门(四)
Hibernate注解,完成原来xml文件里的映射信息. 使用注解时,要修改hibernate.cfg.xml中的映射,不再是通过xml文件 <mapping class="hiber ...
- Jenkins 搭建 .NET Core 持续集成环境
关于c#的.Net FrameWork 的集成环境以及MsBuild的配置可以看 jenkins搭建.NET FrameWork持续集成环境 这篇文章 关于.NET Core 这个项目 ...
- 开放应用模型(OAM):全球首个云原生应用标准定义与架构模型
Kubernetes 项目作为容器编排领域的事实标准, 成功推动了诸如阿里云 Kubernetes (ACK)等云原生服务的迅速增长.但同时我们也关注到,Kubernetes 的核心 API 资源比如 ...
- 10.RabbitMQ Fanout类型交换机
Fanout类型交换机忽略Routing Key,它将消息传递到所有与它绑定的队列上. Producer.java package com.test.fanout; import co ...
- 数据结构C++版-栈
一.概念 二.应用实例 1.进制转换 #include <stdlib.h> #include <iostream> #include <string> #incl ...
- centos7.5下coredns+etcd搭建DNS服务器
coredns简介 安装etcd 安装coredns 设置域名解析 A记录 AAAA记录 CNAME记录 SRV记录 TXT记录 coredns简介 CoreDNS是一个DNS服务器,和Caddy S ...