主要是体现数据之间的关系,一对多之间的关系,保存与删除

两个实体类,一个客户,一个联系人,其中是一对多的关系,一个客户可以对应多个联系人,实体类如下,均省略setget,toString等方法:
Customer实体类

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_linkman;private String cust_phone;private String cust_mobile;//使用set集合表达一对多关系private Set<LinkMan>  linkMens=new HashSet<LinkMan>();}

客户是一的一方,联系人是多的一方,联系人用set集合来表示
LinkMan实体类:

public class LinkMan {private Long lkm_id;private Character lkm_gender;private String lkm_name;private String lkm_phone;private String lkm_email;private String lkm_qq;private String lkm_mobile;private String lkm_memo;private String lkm_position;//表达多对一关系private Customer customer;}

客户在联系人看来是唯一的,所以用类对象Customer即可
实体类之间的关系,主要体现在拿什么作为彼此的属性

演示一下一对多 , 多对一关系操作

public class Demo {@Test//保存客户以及客户下的联系人public void fun1(){//1获得sessionSession session = HibernateUtils.openSession();//2开启事务Transaction tx = session.beginTransaction();//3操作//-------------------------------------------------------------Customer c=new  Customer();c.setCust_name("东京热");LinkMan  lm1=new LinkMan();lm1.setLkm_name("深田咏美");LinkMan  lm2=new LinkMan();lm2.setLkm_name("大桥未久");//表达一对多,客户下有多个联系人c.getLinkMens().add(lm1);c.getLinkMens().add(lm2);//表达多对一,联系人属于哪个客户lm1.setCustomer(c);lm2.setCustomer(c);session.save(c);//-------------------------------------------------------------//4提交事务tx.commit();//5关闭session.close();}@Test//为客户增加联系人public void fun2(){//1获得sessionSession session = HibernateUtils.openSession();//2开启事务Transaction tx = session.beginTransaction();//3操作//-------------------------------------------------------------//1获得要操作的客户对象Customer c = session.get(Customer.class, 1l);//创建联系人LinkMan  lm1=new LinkMan();lm1.setLkm_name("三上悠亚");//3将联系人添加到客户  将客户设置到联系人中c.getLinkMens().add(lm1);lm1.setCustomer(c);//4保存操作session.save(lm1);//-------------------------------------------------------------//4提交事务tx.commit();//5关闭session.close();}@Test//为客户删除联系人public void fun3(){//1获得sessionSession session = HibernateUtils.openSession();//2开启事务Transaction tx = session.beginTransaction();//3操作//-------------------------------------------------------------//1获得要操作的客户对象Customer c = session.get(Customer.class, 1l);//2获得要移除的联系人LinkMan lm1 = session.get(LinkMan.class, 2l);//3把联系人从客户集合中移除c.getLinkMens().remove(lm1);lm1.setCustomer(null);//-------------------------------------------------------------//4提交事务tx.commit();//5关闭session.close();}
}

测试级联操作

public class Demo2 {@Test//保存客户以及客户下的联系人//测试级联保存public void fun1(){//1获得sessionSession session = HibernateUtils.openSession();//2开启事务Transaction tx = session.beginTransaction();//3操作//-------------------------------------------------------------Customer c=new  Customer();c.setCust_name("东京热");LinkMan  lm1=new LinkMan();lm1.setLkm_name("深田咏美");LinkMan  lm2=new LinkMan();lm2.setLkm_name("大桥未久");//表达一对多,客户下有多个联系人c.getLinkMens().add(lm1);c.getLinkMens().add(lm2);//表达多对一,联系人属于哪个客户lm1.setCustomer(c);lm2.setCustomer(c);session.save(c);//-------------------------------------------------------------//4提交事务tx.commit();//5关闭session.close();}@Test//测试删除客户时,级联删除客户下的联系人public void fun2(){//1获得sessionSession session = HibernateUtils.openSession();//2开启事务Transaction tx = session.beginTransaction();//3操作//-------------------------------------------------------------//1获得要操作的客户对象Customer c = session.get(Customer.class, 1l);//2调用delete删除客户session.delete(c);//-------------------------------------------------------------//4提交事务tx.commit();//5关闭session.close();}@Test//保存客户以及客户下的联系人//测试级联保存public void fun3(){//1获得sessionSession session = HibernateUtils.openSession();//2开启事务Transaction tx = session.beginTransaction();//3操作//-------------------------------------------------------------Customer c=new  Customer();c.setCust_name("一本道");LinkMan  lm1=new LinkMan();lm1.setLkm_name("波多野结衣");//表达一对多,客户下有多个联系人c.getLinkMens().add(lm1);//表达多对一,联系人属于哪个客户lm1.setCustomer(c);session.save(lm1);//session.save(c);//-------------------------------------------------------------//4提交事务tx.commit();//5关闭session.close();}}

操作进阶–关系维护属性

public class Demo3 {@Test//保存客户以及客户下的联系人//测试级联保存public void fun1(){//1获得sessionSession session = HibernateUtils.openSession();//2开启事务Transaction tx = session.beginTransaction();//3操作//-------------------------------------------------------------Customer c=new  Customer();c.setCust_name("一本道");LinkMan  lm1=new LinkMan();lm1.setLkm_name("樱空桃");LinkMan  lm2=new LinkMan();lm2.setLkm_name("上原亚衣");//表达一对多,客户下有多个联系人//如果客户放弃维护与联系人的关系,维护关系代码可以省略//c.getLinkMens().add(lm1);//c.getLinkMens().add(lm2);//表达多对一,联系人属于哪个客户lm1.setCustomer(c);lm2.setCustomer(c);session.save(c);session.save(lm1);session.save(lm2);//-------------------------------------------------------------//4提交事务tx.commit();//5关闭session.close();}@Test//删除客户public void fun2(){//1获得sessionSession session = HibernateUtils.openSession();//2开启事务Transaction tx = session.beginTransaction();//3操作//-------------------------------------------------------------Customer c = session.get(Customer.class, 1l);session.delete(c);//-------------------------------------------------------------//4提交事务tx.commit();//5关闭session.close();}}

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"><!-- 配置表与实体对象关系 --><!-- package属性:填写一个包名,元素内部凡是需要书写完整类名的属性,可以直接填写简单类名 -->
<hibernate-mapping  package="cn.itheima.domain"><!-- class元素:配置实体与表的对应关系name:完整类名table:数据库表名--><class  name="Customer" table="cst_customer"><!-- id元素:配置主键映射的属性column(可选):填写表中的主键列名,默认值,列名会默认使用属性名type(可选):填写列(属性类型),hibernate会自动检测实体属性类型每种类型有三种填法:java类型、hibernate类型、数据库类型not-null(可选):配置该属性(列)是否不能为空,默认值falselength(可选):配置数据库中列的长度,默认值:使用数据库累心最大长度--><id name="cust_id" column="cust_id"><!-- generator:主键生成策略 -->      <generator class="native"></generator></id><!-- property元素:除id之外的普通属性映射name:填写属性名column(可选):填写列名type(可选):填写列(属性类型),hibernate会自动检测实体属性类型每种类型有三种填法:java类型、hibernate类型、数据库类型not-null(可选):配置该属性(列)是否不能为空,默认值falselength(可选):配置数据库中列的长度,默认值:使用数据库累心最大长度-->    <property name="cust_name" column="cust_name" not-null="true"><!-- <column name="cust_name"  sql-type="varchar"></column> --></property><property name="cust_source" column="cust_source"></property><property name="cust_industry" column="cust_industry"></property><property name="cust_level" column="cust_level"></property><property name="cust_linkman" column="cust_linkman"></property><property name="cust_phone" column="cust_phone"></property><property name="cust_mobile" column="cust_mobile"></property><!-- 集合,一对多关系,在配置文件中配置 --><!-- name属性:集合属性名column属性:外键列名class属性:与我关联的对象完整类名--><!-- 级联操作  cascadesave-update:级联保存更新delete:级联删除all:save-update+delete级联操作:简化操作--><!-- inverse属性:配置关系是否维护true:customer不维护关系false(默认):customer维护关系inverse:性能优化,提高关系维护的性能原则:无论怎么放弃,总有一方要维护关系一对多关系中:只能一的一方放弃,多的一方不能放弃--><set name="linkMens" cascade="save-update"><key column="lkm_cust_id"></key><one-to-many class="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  package="cn.itheima.domain"><class  name="LinkMan" table="cst_linkman"><id name="lkm_id" column="lkm_id"><generator class="native"></generator></id>  <property name="lkm_gender"></property><property name="lkm_name"></property><property name="lkm_phone"></property><property name="lkm_email"></property><property name="lkm_qq"></property><property name="lkm_mobile"></property><property name="lkm_memo"></property><property name="lkm_position"></property><!-- 多对一 --><!-- 级联操作  cascadesave-update:级联保存更新delete:级联删除all:save-update+delete级联操作:简化操作--><!-- 多的一方:不能放弃维护关系,外键字段就在多的一方 --><many-to-one name="customer"  column="lkm_cust_id" class="Customer" ></many-to-one></class>
</hibernate-mapping>

Hibernate笔记整理3(一对多关系,保存删除操作)相关推荐

  1. Hibernate中的级联一对多关系

    两个pojo,Baby 和Baby File 对应数据库中表baby和babyfile.两个表有外键关联,且babyfile的外键不能为空 配置了个单向一对多,级联关系为save-update /** ...

  2. Hibernate_2_Hibernate中对象状态及转化_一级缓存_Session详解_HQL/SQL/Criteria_一对多关系_级联操作

    Hibernate中的对象状态 在Hibernate中持久化对象具有三种状态: 瞬时态, 持久态, 游离态. 瞬时态: 对象没有与Hibernate产生关联(transient,session中没有缓 ...

  3. Python二级笔记整理

    Python二级笔记整理 00讲 1. 单选: 2. 操作 3.教材 4.python3.5.2以上 环境配置 Hello World 01讲 01章 程序设计的基本方法 导图 程序设计语言 编译和解 ...

  4. hibernate中一对多关系的映射

    昨天初次接触hibernate,仅仅弄懂了一对一关系的映射.今天学习了一天又有了新的收获,弄懂了一对多之间关系的映射. 一.一对多的关系映射 建立一对多关系关系的表的原则是将一的一方的主键加入到多的一 ...

  5. 【Hibernate】Hibernate实体映射——单边的一对多关系

    数据库中的表是有关系的,两个表之间可以通过外键关联.如果把表抽象为实体类,这些关系可以抽象为实体之间的一对一,一对多,多对一等关系.hibernate能处理这些复杂的关系,前提是要正确配置这些关系. ...

  6. Hibernate中的一对多关系映射

    Hibernate框架中关系映射中有:一对一.一对多和多对多,但常用的就是一对多,所以本篇博客就大体概述了一下一对多关系映射. 一对多关系: 例如:客户和订单,客户是一,订单是多 创建customer ...

  7. (经典)Hibernate的一对多关系映射(三)

    一对多关系是表提出来的概念,两张表之间会存在这种,前提是有外键关联. 例如:省份和城市 如果设计类,怎样描述省份和城市之间的一对多关系 省份类里包含多个城市对象,使用 Set集合来描述 城市类里包含一 ...

  8. Mybatis学习笔记 4:Mybatis 连表查询(一)——一对多关系

    完整代码在这 在查询数据库时,我们经常会遇到多张表联合查询的情况,而Mybatis使连表查询更加简便了,查询出的数据格式非常易于使用,省去了一大部分复杂的代码编写工作,对于关系型数据库来说,数据模型之 ...

  9. 订单 图片(一对多关系),地址保存在一个字段中(Json数组对象格式)

    订单---->图片(一对多关系),地址保存在一个字段中(Json数组对象格式) 1.前端列表动态添加: jsp:<form id="postForm" method=& ...

最新文章

  1. linux+用户的shell,Linux用户管理(十)Linux Shell高级
  2. Android 控件学习--自定义SeekBar
  3. mono beta 3 released
  4. xtrabackup备份mysql“ib_logfile0 is of different”错误分析
  5. 2019年5月数据库流行度排行:老骥伏枥与青壮图强
  6. python预处理后变量情况描述_【数据预处理】python旅游网站数据清洗实践
  7. 图形学的几个非常有用的转换
  8. 失败后的从容离开,无意之中也许会再次点亮希望之光
  9. Python3 可变对象VS不可变对象、 对象的赋值、深拷贝VS浅拷贝
  10. xtragrid 某个值 查找_XtraPivotGrid根据列(行)的汇总值对列(行)标头进行查找...
  11. mysql 找表重复数据_mysql 数据表中查找重复记录
  12. 试验设计第二版茆诗松课后题答案_试验设计习题及答案
  13. 防护等级 ipx9、ipx9k、ip69、ip69k之间的区别
  14. 怎样通过《Sbo维护与开发助手软件》进行Sbo开发和维护(1/3)
  15. pacman使用介绍
  16. 皇家骑士团 100问
  17. 2021年完美解决Gradle下载慢的问题(Android Studio)
  18. Android Studio代码统计插件Statistic
  19. Java知识复习清单
  20. 浅析Python文件操作

热门文章

  1. 如何在本地部署小幺鸡(小幺鸡简单好用的接口管理工具)
  2. Vue 数字千位分隔符
  3. 基于 jsp + servlet + Mysql 实现 网上书店购物系统 (源码)
  4. nodejs 学习之 pkg 打包成 可执行性文件
  5. musicFm我最爱的电台
  6. 使用python代码,将csv文件中的问题逐条向ChatGPT提问,并将ChatGPT回复的结果新建为一个文件保存,文件名为所提出的问题,最后所有生成的word文件都保存在一个新生成的文件夹中。
  7. 小样本数据集 (Few-shot Learning)
  8. hdmi网线延长器_什么是HDMI网线延长器?浅析HDMI1.3网线延长器原理和应用
  9. 七日杀服务器自动保存时间,七日杀服务端架设 免主机跳出存档清空解决方法和技巧...
  10. 使用Subversion版本控制工具