首先,我们提出两个比较有意思的问题:
- 我们得理解什么是JPA中的Cascade?
- 其次我们需要理解Cascade在什么情况下使用?
JPA中的Cascade是什么
JPA将实体状态转化为数据库的DML执行语句。一般情况下,我们都是对实体图(也可以称为实体网络图)进行操作,JPA 允许我们将实体状态更改从父实体传播到子实体。这些行为是通过 CascadeType 映射配置的。
JPA中的Cascade的使用场景是什么
必须明确一点的是:
是否应该使用级联是一个业务问题,而不是一个技术问题
我们只说明最普遍的情形,那就是一对多的情况,在一对多的级联中:
如果对象之间是组合关系,使用级联;
如果是聚合关系,不用级联.
组合和聚合的区别:
这两个词的来源是面向对象的分析与设计的技术中产生的。
当一个对象A是由多个其它对象(B,C,D...)组成的,如果当A不存在了,那么B,C,D...的存在就没有意义的情况下那么它们之间就是组合关系。
如果当A不存在了,B,C,D...单独存在也是有意义的情况下就是聚合关系。
下面我们来举个例子,这个例子中是对JAVA文件的结构进行建模。如图所示:

某中sourceclass是java文件的信息。
sourcefield是java文件的信息。
sourcemethod是java文件的方法信息。
sourcemethodparameter是java文件的方法参数信息。
sourcemethodreturnvalue是java文件的方法返回值信息。
当一个java的文件被删除了,那么她所对应的属性信息,方法信息的存在就没有意义了。如果当删除java的文件信息的时候,没有删除她的属性信息和方法信息,那么就会留下很多的孤儿-垃圾数据。所以她们之间的关系就属于组合关系。在实体映射的时候,就应该把他们配置级联。
至于代码嘛,我们后文再来学习,后面的学习有两个原则,那就是:
1、具体的业务场景建模是怎么样的,是组合还是聚合
2、到底应该采用哪种具体的级联方式,而不是一味的采用Cascade.ALL
注:本文的图片来源于,感谢感谢。