Spring Boot Jpa之CascadeType
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相关推荐
- spring boot jpa级联保存
spring boot jpa级联保存 CascadeType oneToMany关系 one的一方中加 @OneToMany(fetch = FetchType.EAGER, cascade = C ...
- Spring Boot JPA中关联表的使用
文章目录 添加依赖 构建Entity 构建Repository 构建初始数据 测试 Spring Boot JPA中关联表的使用 本文中,我们会将会通过一个Book和Category的关联关系,来讲解 ...
- 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 项目 ...
- 解决spring boot+JPA实现操作数据库时编辑时也变成了新增
场景:使用spring boot+JPA框架开发项目的时候,新增数据是正常的,但是编辑有时候会变成新增,JPA判断是否新增对象有两个方法:1根据id,2根据版本号.我在开发项目中用的是根据版本号进行判 ...
- Spring Boot JPA 中transaction的使用
文章目录 @Transactional的实现 @Transactional的使用 Transaction的传播级别 REQUIRED SUPPORTS MANDATORY NEVER NOT_SUPP ...
- Spring Boot JPA的查询语句
文章目录 准备工作 Containing, Contains, IsContaining 和 Like StartsWith EndsWith 大小写不敏感 Not @Query Spring Boo ...
- Spring Boot JPA中使用@Entity和@Table
文章目录 默认实现 使用@Table自定义表格名字 在JPQL Queries中重写表格名字 Spring Boot JPA中使用@Entity和@Table 本文中我们会讲解如何在Spring Bo ...
- Spring Boot JPA中java 8 的应用
文章目录 Optional Stream API CompletableFuture Spring Boot JPA中java 8 的应用 上篇文章中我们讲到了如何在Spring Boot中使用JPA ...
- Spring Boot + JPA + Freemarker 实现后端分页 完整示例
Spring Boot + JPA + Freemarker 实现后端分页 完整示例 界面效果 螢幕快照 2017-07-28 15.34.42.png 螢幕快照 2017-07-28 15.34.2 ...
最新文章
- 权限表管理之更新权限表数据
- windows 服务开发教程
- C# 访问并打开局域网文件夹
- 安全的 ActiveMQ
- 自动给文本框输入值_Dynamo for Revit自动生成门窗图例详图
- python图像边缘提取_python通过robert、sobel、Laplace算子实现图像边缘提取详解
- Java工程师知识图谱
- 东北师范大学计算机科学与技术录取分数线,东北师范大学计算机科学与技术专业2015年在河南理科高考录取最低分数线...
- 网贷大数据什么时候会好_如果人类把地球钻穿了,会发生什么?大数据分析告诉你多可怕...
- mysql用户信息备份还原_mysql迁移之新建用户、备份还原数据库
- 2018年9月计算机英语统考,2018年9月大学英语统考题库 2018年9月网络统考英语B复习资料.doc...
- 语义Web的一些概念和资源
- leetcode56. Merge Intervals
- php控制表格颜色,php – 表格列的背景颜色
- C语言推箱子完整代码
- tf.contrib.layers.embed_sequence()函数
- [bzoj3140][二分图匹配]消毒
- python evn安装模块pip
- 水表读数图解_水表读数怎么正确看 水表怎么读?
- 一起来玩玩WebGL--第一弹