在上一篇Hibernate总结(一)简单总结了一级缓存,快照,增删改查的简单使用,这一篇总结两张表的级联操作。

级联涉及到三种情况,many-many,1-many,many-1。

  • 首先是1-many,many-1情况,所以先设置一个情景:客户与订单的关系
//因为太占版面缘故,没有列出get()/set()方法
public class Customer {private Integer id;private String name;private Set<Order> orders = new HashSet<Order>();//1对多
}
public class Order {private Integer id;private String name;private Customer customer;//多对1
}

接下来是hibernate.cfg.xml与两个实体类的配置文件Order.hbm.xml与Customer.hbm.xml,第一个不多说,主要是映射文件的配置

//Customer.hbm.xml
<hibernate-mapping package="king.domain"><class name="Customer" table="t_customer"><id name="id" column="id"><generator class="native"></generator></id><property name="name" column="name"></property><!-- 一对多关系 --><!--         inverse:true 不维护关系,交给拥有外键一方维护       cascade:save-update(级联保存与级联更新),当然还有其它选项,delete(级联删除),all(级联保存,更新,删除),none(默认没有级联)       --><set name="orders" inverse="true" cascade="save-update"><key column="cid"></key>      <!-- 在Order表中的外键的名字--><one-to-many class="Order"/></set></class>
</hibernate-mapping>
//Order.hbm.xml
<hibernate-mapping package="king.domain"><class name="Order" table="t_order"><id name="id" column="id"><generator class="native"></generator></id><property name="name" column="name"></property><!-- 多对一关系 --><!-- 含有外键一方维护关系 --><many-to-one name="customer" column="cid" class="Customer"></many-to-one></class>
</hibernate-mapping>

一切准备就绪,开始级联的代码:

因为代码中大量使用了得到连接,关闭连接操作,所以我使用了模板设计模式,在我的文章《Hibernate-模板模式》有讲解

    /*** 级联保存:* 1.inverse="true",维护关系,最好只有一方维护,而且是拥有外键一方维护* 2.cascade="save-update",级联保存与级联更新*/@Testpublic void test0() {new SessionTemplate(){@Overridepublic void fun(Session s) {Customer c=new Customer();c.setName("King");Order o1=new Order();o1.setName("炒面");Order o2=new Order();o2.setName("肉");o1.setCustomer(c);//由拥有外键一方维护关系o2.setCustomer(c);s.save(c);s.save(o1);s.save(o2);//这样框架只执行了3条SQL语句}}.execute();}

    /*** 级联删除:* 1.inverse="false"为默认处理方式:把客户的订单的外键修改为null,然后再删除客户* 2.inverse="true"若客户不处理,会出错*/@Testpublic void test1() {new SessionTemplate(){@Overridepublic void fun(Session s) {         //这是没有使用级联删除的情况,这时cascade为save-updateCustomer c=(Customer) s.get(Customer.class, 3);for(Order o:c.getOrders()){s.delete(o);}s.delete(c);//此时,inverse="true",所以前面删除了所有客户的订单才能删除客户

          //更改配置文件,cascade为delete,这时就是级联删除
                Customer c=(Customer) s.get(Customer.class, 3);s.delete(c);//这时不需要手动删除订单了
            }}.execute();}

    /*** 级联更新   * cascade为save-update */@Testpublic void test2() {new SessionTemplate(){@Overridepublic void fun(Session s) {Customer c=(Customer) s.get(Customer.class, 2);for(Order o:c.getOrders()){o.setName("羊杂汤");//持久态,不需要更新
                }}}.execute();}

查询涉及到了加载策略,所以很复杂,所以将在写在下一篇中。

  • 接下来说many-many的情况,还是先设置一个情景:学生与课程的关系
public class Student {private Integer id;private String name;private Set<Course> courses=new HashSet<>();//多对多
}
public class Course {private Integer id;private String name;private Set<Student> students=new HashSet<>();//多对多
}

接下来是两个实体类与数据库表的映射文件:

//Student.hbm.xml
<hibernate-mapping package="king.domain"><class name="Student" table="t_student"><id name="id" column="id"><generator class="native"></generator></id><property name="name" column="name"></property><!-- 多对多关系,在多对多中,需要双方都设置存储关系的表名 --><set name="courses" cascade="save-update" table="t_selectcourse"><key column="sid"></key><many-to-many class="Course" column="cid"></many-to-many></set></class>
</hibernate-mapping>
//Course.hbm.xml
<hibernate-mapping package="king.domain"><class name="Course" table="t_course"><id name="id" column="id"><generator class="native"></generator></id><property name="name" column="name"></property><!-- 多对多关系 --><!-- 维护权反转给对方 --><set name="students" inverse="true" table="t_selectcourse"><key column="cid"></key><many-to-many class="Student" column="sid"></many-to-many></set></class>
</hibernate-mapping>

一切准备继续,开始代码工作:

    /*** 多对多* 级联保存:   * 本来想也写上级联删除与级联更新,但是发现写的代码和我想要实现的结果不同,故没有贴出代码,额...我的意思就是我也不会...挺尴尬...*/@Testpublic void test0() {new SessionTemplate(){@Overridepublic void fun(Session s) {Student s1=new Student();s1.setName("King");Course c1=new Course();c1.setName("数学");Course c2=new Course();c2.setName("英语");s1.getCourses().add(c1);//由学生维护关系s1.getCourses().add(c2);//由学生维护关系
                s.save(s1);}}.execute();}

增删改查,现在就差“查”没有写出,我将在下一篇总结中写出Hibernate的关于查询的加载策略。

转载于:https://www.cnblogs.com/kingofkai/p/6023415.html

Hibernate总结(二)相关推荐

  1. spring mvc+spring + hibernate 整合(二)

    在上篇文章中,我建立了工程并配置了spring + hibernate.今天我们检验下上篇文章的成果,如何检查呢?那就是进行单元测试.本篇文章就让大家和我一起来就前面的建的工程进行单元测试. 本项目使 ...

  2. Hibernate学习(二):heibernate核心接口

    Hibernate是一种对JDBC做了轻量级封装的对象---关系映射工具,所谓轻量级封装,是指Hibernate并没有完全封装JDBC,Java应用即可以通过Hibernate API访问数据库,还可 ...

  3. hibernate框架(二)核心配置API

    一:核心配置分为三大部分  必须的配置 .可选的配置和引入映射文件. 1.必须的配置 连接数据库的参数:驱动类  url路径  用户名  密码  方言 <property name=" ...

  4. 框架之 hibernate之二

    1. Hibernate持久化对象的状态 2. Hibernate的一级缓存 3. Hibernate操作持久化对象的方法 4. Hibernate的基本查询 Hibernate的持久化类 什么是持久 ...

  5. Hibernate入门(二)——hibernateAPI详解

    Hibernate API 详解 1.Configuration 功能:配置加载类,用于加载主配置,orm元数据加载 .创建: Configuration conf = new Configurati ...

  6. Hibernate(二)——一对多查询

    1. 前言 本章节我们讨论Hibernate一对多查询的处理. 在上一章节中(Hibernate(一)--入门),我们探讨了Hibernate执行最基本的增删改查操作.现在我们将情况复杂化:加入我们在 ...

  7. Java程序员从笨鸟到菜鸟之(五十一)细谈Hibernate(二)开发第一个hibernate基本详解...

    在上篇博客中,我们介绍了<hibernate基本概念和体系结构>,也对hibernate框架有了一个初步的了解,本文我将向大家简单介绍Hibernate的核心API调用库,并讲解一下它的基 ...

  8. hibernate入门二之单表操作

    友情提醒:以下所有的操作都是在hibernate入门一的基础上操作的,参考链接:https://www.cnblogs.com/lindaiyu/p/10990525.html 单一主键 assign ...

  9. 一口一口吃掉Hibernate(二)——别被世俗蒙蔽了双眼:Hibernate中Session之get和load方法的真正区别

    最近在学习SHH框架中的Hibernate,对Session的get和load方法,有点混不清楚,不知道区别在哪,或者对它们的区别感触不深.所以百度了一下,结果问题来了.百度的结果和实际测试的结果出入 ...

  10. Hibernate(二)

    3.2.3.编写Hibernate应用 Hibernate中的所有操作主要是以POJO展开的,但是如果要想操作POJO,则肯定必须使用Session,Session的取得必须按照以下的步骤: 1. 实 ...

最新文章

  1. Python使用matplotlib可视化面积图(Area Chart)、通过给坐标轴和曲线之间的区域着色可视化面积图、在面积图的指定区域添加箭头和数值标签
  2. java短_Java中的最短代码和最低延迟
  3. Leet Code OJ 292. Nim Game [Difficulty: Easy]
  4. java 设计模式 示例_Java中的中介器设计模式-示例教程
  5. Pytorch常用操作
  6. a5d27 emmc启动 修改1
  7. 阅读吴军《信息时代对人才技能的要求》
  8. Linux 共享库LD_PRELOAD环境变量
  9. Jaakko isalo谈《愤怒的小鸟》创意来源
  10. VVC/JEM代码学习17:xCheckRDCostMerge2Nx2NFRUC
  11. android httpClient 支持HTTPS的2种处理方式
  12. MySQL安装配置教程(超级详细、保姆级)
  13. 清除显卡右键菜单批处理.bat
  14. 【计算机网络】PDU地址
  15. Windows 10的最新版本是什么?
  16. JS鼠标滑过图片时切换图片
  17. python基本输入输出函数有_python基本输入输出函数与变量类型
  18. 炫龙P6笔记本搭建Windows 10+Ubuntu双系统
  19. [Swift]UITextField在左侧添加内边距或图标
  20. 简单操作阿里云盘秒变电脑本地硬盘使用!秒多1T内存

热门文章

  1. DB2定时清理归档日志脚本
  2. Lync Server 2010标准版系列PART4:部署准备
  3. MariaDB CEO 痛斥云厂商对开源的无尽掠夺,从不回馈社区
  4. 论分层思想在各行各业的应用
  5. Elasticsearch 参考指南(多索引)
  6. webpack4 系列教程: 前言
  7. 工作总结 npoi 模板 导出公式 excel
  8. 理解MVC—从实例出发:基于MVC模式的简易算术计算器
  9. hihoCoder #1142 : 三分求极值
  10. nginx防止跨站 lnmp多站点安全设置之一