Spring Boot Jpa之CascadeType

JPA允许您传播从父实体到子级的状态转换。为此,JPA javax.persistence.CascadeType定义了各种级联类型:

ALL
级联所有实体状态转换

PERSIST
级联实体持久化操作。

MERGE
级联实体合并操作。

REMOVE
级联实体删除操作。

REFRESH
级联实体刷新操作。

DETACH
级联实体分离操作。

此外,CascadeType.ALL将会传播任何Hibernate特定的操作,它由org.hibernate.annotations.CascadeType枚举定义:

以下示例将使用以下实体来解释上述一些级联操作:

@Entity
public class Person {@Idprivate Long id;private String name;@OneToMany(mappedBy = "owner", cascade = CascadeType.ALL)private List<Phone> phones = new ArrayList<>();public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Phone> getPhones() {return phones;}public void addPhone(Phone phone) {this.phones.add( phone );phone.setOwner( this );}
}@Entity
public class Phone {@Idprivate Long id;@Column(name = "`number`")private String number;@ManyToOne(fetch = FetchType.LAZY)private Person owner;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public Person getOwner() {return owner;}public void setOwner(Person owner) {this.owner = owner;}
}

CascadeType.PERSIST示例

Person person = new Person();
person.setId( 1L );
person.setName( "John Doe" );Phone phone = new Phone();
phone.setId( 1L );
phone.setNumber( "123-456-7890" );person.addPhone( phone );entityManager.persist( person );

当父实体Person被持久化时,会连同持久化子实体Phone。

对象会进入到持久化状态,对该对象的操作会自动同步到数据库。

指定cascade = CascadeType.PERSIST在实体类关联的实体字段上,那么保存该实体类时会级联保存该实体类关联的实体。

CascadeType.MERGE示例

Phone phone = entityManager.find( Phone.class, 1L );
Person person = phone.getOwner();person.setName( "John Doe Jr." );
phone.setNumber( "987-654-3210" );entityManager.clear();entityManager.merge( person );

查询Phone实体的时候会执行语句:

SELECTp.id as id1_0_1_,p.name as name2_0_1_,ph.owner_id as owner_id3_1_3_,ph.id as id1_1_3_,ph.id as id1_1_0_,ph.number as number2_1_0_,ph.owner_id as owner_id3_1_0_
FROMPerson p
LEFT OUTER JOINPhone phon p.id=ph.owner_id
WHEREp.id = 1

在合并期间,获取子实体Phone时,会连同获取级联的父实体Person。这个级联只能合并数据库已存在的实体。

对象会进入到被管理状态,对该对象(可以是任何状态的对象)的操作会自动同步到数据库。

CascadeType.REMOVE示例

Person person = entityManager.find( Person.class, 1L );
entityManager.remove( person );

执行的SQL:

DELETE FROM Phone WHERE id = 1DELETE FROM Person WHERE id = 1

该CascadeType.REMOVE使我们能够沿父实体一个删除级联的子实体。

CascadeType.DETACH

意思是,分离所有相关联的实体,该实体已在数据库中,对象将处于分离状态,对该对象的操作不会同步到数据库。

CascadeType.REFRESH

  Person person = personDao.findOne(944397L);Phone phone = person.getPhones().get(0);person.setName( "John Doe Jr." );phone.setNumber( "987-654-3210" );personDao.save( person );assertEquals( "John Doe", person.getName() );assertEquals( "123-456-7890", phone.getNumber() );

当对父实体Person级联的对象进行操作并保存时,会关联保存子实体Phone到数据库。

以上。。。

Spring Boot Jpa之CascadeType相关推荐

  1. spring boot jpa级联保存

    spring boot jpa级联保存 CascadeType oneToMany关系 one的一方中加 @OneToMany(fetch = FetchType.EAGER, cascade = C ...

  2. Spring Boot JPA中关联表的使用

    文章目录 添加依赖 构建Entity 构建Repository 构建初始数据 测试 Spring Boot JPA中关联表的使用 本文中,我们会将会通过一个Book和Category的关联关系,来讲解 ...

  3. Spring Boot JPA 2.7.2

    icon: edit date: 2022-01-02 category: CategoryA tag: tag A tag B star: true Spring Boot JPA 2.7.2 项目 ...

  4. 解决spring boot+JPA实现操作数据库时编辑时也变成了新增

    场景:使用spring boot+JPA框架开发项目的时候,新增数据是正常的,但是编辑有时候会变成新增,JPA判断是否新增对象有两个方法:1根据id,2根据版本号.我在开发项目中用的是根据版本号进行判 ...

  5. Spring Boot JPA 中transaction的使用

    文章目录 @Transactional的实现 @Transactional的使用 Transaction的传播级别 REQUIRED SUPPORTS MANDATORY NEVER NOT_SUPP ...

  6. Spring Boot JPA的查询语句

    文章目录 准备工作 Containing, Contains, IsContaining 和 Like StartsWith EndsWith 大小写不敏感 Not @Query Spring Boo ...

  7. Spring Boot JPA中使用@Entity和@Table

    文章目录 默认实现 使用@Table自定义表格名字 在JPQL Queries中重写表格名字 Spring Boot JPA中使用@Entity和@Table 本文中我们会讲解如何在Spring Bo ...

  8. Spring Boot JPA中java 8 的应用

    文章目录 Optional Stream API CompletableFuture Spring Boot JPA中java 8 的应用 上篇文章中我们讲到了如何在Spring Boot中使用JPA ...

  9. Spring Boot + JPA + Freemarker 实现后端分页 完整示例

    Spring Boot + JPA + Freemarker 实现后端分页 完整示例 界面效果 螢幕快照 2017-07-28 15.34.42.png 螢幕快照 2017-07-28 15.34.2 ...

最新文章

  1. 权限表管理之更新权限表数据
  2. windows 服务开发教程
  3. C# 访问并打开局域网文件夹
  4. 安全的 ActiveMQ
  5. 自动给文本框输入值_Dynamo for Revit自动生成门窗图例详图
  6. python图像边缘提取_python通过robert、sobel、Laplace算子实现图像边缘提取详解
  7. Java工程师知识图谱
  8. 东北师范大学计算机科学与技术录取分数线,东北师范大学计算机科学与技术专业2015年在河南理科高考录取最低分数线...
  9. 网贷大数据什么时候会好_如果人类把地球钻穿了,会发生什么?大数据分析告诉你多可怕...
  10. mysql用户信息备份还原_mysql迁移之新建用户、备份还原数据库
  11. 2018年9月计算机英语统考,2018年9月大学英语统考题库 2018年9月网络统考英语B复习资料.doc...
  12. 语义Web的一些概念和资源
  13. leetcode56. Merge Intervals
  14. php控制表格颜色,php – 表格列的背景颜色
  15. C语言推箱子完整代码
  16. tf.contrib.layers.embed_sequence()函数
  17. [bzoj3140][二分图匹配]消毒
  18. python evn安装模块pip
  19. 水表读数图解_水表读数怎么正确看 水表怎么读?
  20. 一起来玩玩WebGL--第一弹

热门文章

  1. 机器学习理论与实战(十六)概率图模型04
  2. iOS安全攻防(四):阻止GDB依附
  3. 魔百和M301HCW强制升级刷机包(附教程)
  4. 基于HTML和JavaScript的会议室预约管理系统
  5. VR全景拍摄为什么要加盟?巧借资源实现共赢
  6. 图论:连通分量和强连通分量
  7. Linux(b站视频兄弟连)自学笔记第十章——shell基础
  8. 三星I9100/I9100G/I9250
  9. java从键盘录入三位数,打印其个位十位百位
  10. er jt,la f 织法教程|毛衣花样图解|视频教程-编织人生