点击上方 好好学java ,选择 星标 公众号

重磅资讯、干货,第一时间送达
今日推荐:团队开发中的 Git 实践个人原创+1博客:点击前往,查看更多
作者:潘佳琦
链接:https://segmentfault.com/a/1190000021857759

前言

image.png

由图中可以看出实体间关系:一对多(@OneToMany

在实际开发场景中,删除员工老板不会被删除,老板被删除了员工肯定要删除

由此,就会使用级联操作,在一对多关系中,@Cascade属性(级联)只设置“一”的一方即可,外键由“多”的一方进行维护。

@ManyToOne和@OneToMany 注解

  1. ManyToOne(多对一)单向:不产生中间表,但可以用@Joincolumn(name=" ")来指定生成外键的名字,外键在多的一方表中产生。

  2. OneToMany(一对多)单向:会产生中间表,此时可以用@onetoMany @Joincolumn(name=" ")避免产生中间表,并且指定了外键的名字(别看@joincolumn在一中写着,但它存在在多的那个表中)

  3. OneToMany , ManyToOne 双向(两个注解一起用的):如果不在@OneToMany中加mappedy属性就会产生中间表。

cascade属性:指定级联操作的行为(可多选)

  • CascadeType.PERSIST:级联新增(又称级联保存):对A对象保存时也会对B对象进行保存。并且,只有A类新增时,会级联B对象新增。若B对象在数据库存在则抛异常。对应EntityManagerpresist方法。

  • CascadeType.MERGE:级联合并(级联更新):指A类新增或者变化,会级联B对象(新增或者变化)。对应EntityManagermerge方法。

  • CascadeType.REMOVE:级联删除:只有A类删除时,会级联删除B类,即在设置的那一端进行删除时,另一端才会级联删除。对应EntityManagerremove方法。

  • CascadeType.REFRESH:级联刷新:获取A对象时也重新获取最新的B对象。对EntityManagerrefresh(object)方法。即会重新查询数据库里的最新数据(用的比较少)

  • CascadeType.DETACH:级联分离。

  • CascadeType.ALL:级联所有操作。

示例(以级联保存及删除为例)

Boss老板实体:

@Entity
public class Boss {@Id  @GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;@OneToMany(mappedBy = "boss")private List<Staff> staffList;
}

Staff员工实体:

@Entity
public class Staff {@Id  @GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;@ManyToOne  private Boss boss;
}

不添加任何级联

执行save保存操作,结果如下

老板表:

image.png

员工表:

image.png

执行的SQL:

insert into boss (name) values ('张老板')

PERSIST:级联新增(又称级联保存)

@OneToMany(mappedBy = "boss", cascade = CascadeType.PERSIST)
private List<Staff> staffList;

执行save保存操作,结果如下

老板表:

image.png

员工表:

image.png

员工已经级联保存,但是员工表中的boss_id却是空,可见级联是直接将set中的对象持久化到数据库,而并没有对关系进行维护(需要手动去维护)。

执行的SQL:

insert into boss (name) values ('张老板') insert into staff (boss_id, name) values (1, '员工一') insert into staff (boss_id, name) values (1, '员工二')

直接在数据库中执行SQL关系是维护好的

REMOVE:级联删除

@OneToMany(mappedBy = "boss", cascade = CascadeType.REMOVE)
private List<Staff> staffList;

执行delete保存操作,结果如下

老板表:

员工表:

image.png

执行的SQL

select boss0_.id as id1_0_0_, boss0_.name as name2_0_0_ from boss boss0_ where boss0_.id=1select stafflist0_.boss_id as boss_id3_2_0_, stafflist0_.id as id1_2_0_, stafflist0_.id as id1_2_1_, stafflist0_.boss_id as boss_id3_2_1_, stafflist0_.name as name2_2_1_ from staff stafflist0_ where stafflist0_.boss_id=1delete from staff where id=1
delete from staff where id=2
delete from boss where id=1

老板表该条记录删除,同时员工表中的记录也被级联删除。

代码

https://github.com/panjiaqi1/Demo

Hibernate @OneToMany 及 @Cascade级联操作相关推荐

  1. Hibernate一对多关联映射及cascade级联操作

    我们以客户(Customer)与订单(Order)为例 实体类创建 Order订单实体类 //订单-----多的一方 public class Order {private Integer id;pr ...

  2. Hibernate的Cascade——级联操作

    在Hibernate中,针对持久化实体的配置文件中有Cascade这样一个属性,顾名思义就是级联,也就是说在操作当 前实体时,针对当前实体的操作会影响到相应配置的关联实体.比如针对当前实体进行保存操作 ...

  3. Java三大框架之——Hibernate关联映射与级联操作

    什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...

  4. 详细理解java Hibernate 或 JPA的级联操作

    2019独角兽企业重金招聘Python工程师标准>>> 先占个坑,一会儿来补 转载于:https://my.oschina.net/shichangcheng/blog/780496

  5. mysql表的级联操作_mysql表之间的关系及级联操作

    表之间的关系 foreign key 外键约束,用于指向另一个表的主键字段 # 创建表的时候添加外键 create table teacher( id int primary key auto_inc ...

  6. Hiberate 级联操作(cascade,many-to-one,one-to-many,many-to-many)

    使用的数据 建表语句 CREATE DATABASE Hibernate02; USE Hibernate02; CREATE TABLE `cut_customer`( `cust_id` bigi ...

  7. Hibernate级联操作 注解

    EJB3 支持的操作类型 /*** Cascade types (can override default EJB3 cascades*/ public enum CascadeType {ALL,P ...

  8. hibernate级联操作详解

    2019独角兽企业重金招聘Python工程师标准>>> 级联操作 一.简单的介绍 cascade和inverse (Employee – Department) l Casade用来 ...

  9. Hibernate学习-14:实体之间的关系及其配置,级联操作

    1.实体之间有三种关系: * 一对多: * 一个用户,生成多个订单,每一个订单只能属于一个用户. * 建表原则: * 在多的一方创建一个字段,作为外键,指向一的一方的主键. * 多对多: * 一个学生 ...

最新文章

  1. python用pil图像放大缩小_python使用PIL缩放网络图片并保存的方法
  2. 如何使用ABAP代码反序列化JSON字符串成ABAP结构
  3. [正则表达式] 可以解析HTML/XHTML页面的所有元素和结构的Regular Expression![ZT]
  4. 调试信息清除小工具的编写
  5. 20145228 《信息安全系统设计基础》第九周学习总结 (2)
  6. python2.3嵌套if结构:
  7. Asterisk 11 chan_sip.c: Failed to authenticate device 看不到IP的问题
  8. 史上最全的Maven Pom文件标签详解
  9. cmd编译java代码
  10. Navicat 注册机破解问题
  11. Echarts柱状图配置
  12. excel冻结窗口怎么设置_Win7电脑窗口颜色怎么设置成护眼色?简单几步就能搞定...
  13. 智慧城市 宠物管理系统的重要性 --“遛狗不牵绳-违法”
  14. 计算机专业排名2014,2014计算机考研院校排名
  15. 计算机基础知识是一级吗,计算机二级和初级的区别 初级是一级吗
  16. 最简单的,安装flash插件
  17. twitch.tv 聊天特殊表情符号
  18. css-边框重叠问题解决
  19. flexbuilder 开发工具
  20. JavaScript实现N个视频的切换

热门文章

  1. ASP.NET MVC Tip #31: 给 Master Pages 和 User Controls 传递数据
  2. 让每次编译产生的目标文件都能打印出编译时间信息
  3. 文本挖掘预处理流程总结(1)— 中文
  4. 机器学习+算法考试有感 2019 山东大学
  5. JavaScript流程控制之分支结构
  6. 【python】排序算法的稳定性冒泡排序(画图详细讲解)
  7. 用_beginthreadex不用 CreateThread
  8. MFC C++ 获取外网IP地址
  9. linux dev_info,Linux命令集-xfs_info
  10. linux编译llvm代码