CascadeType级联关系

来源:互联网 发布:linux 云硬盘 挂载 编辑:程序博客网 时间:2024/06/06 01:35

菜鸟的一点体会记录,难免有错,望能指点,不胜感激,也可粗言相加,当做激励,若能有助于人,万分荣幸~

CascadeType级联关系

CascadeType.PERSIST —-级联保存

CascadeType.MERGE —-级联更新

CascadeType.REMOVE —-级联删除

CascadeType.REFRESH —-级联刷新

CascadeType.ALL —-级联所有

OrphanRemoval —-去掉孤值

讲解

  • 以下用数据集和字段一对多关联关系为例,字段是多的一方,即控制方,通过数据集id来管理关系,字段中使用@JoinColumn(name = “DATA_SET_DEF_ID”)来保存数据集,注意@JoinColumn和mappedBy冲突,而数据集是关系被控方,其使用mappedBy表明关系被控方。
  • 级联注解的意思是当级联所在的类进行相应操作时,标有级联关系的属性按照级联注解进行相应操作
    • CascadeType.PERSIST–当数据集中的字段有此注解时,新建字段和数据集,然后字段set到数据集中,只保存数据集时这些字段也会自动保存
    • CascadeType.MERGE–当数据集中的字段有此注解时,修改字段,然后更新数据集时这些字段会自动更新
    • CascadeType.REMOVE–当数据集中的字段有此注解时,删除数据集,那么其字段也会被删除
    • CascadeType.REFRESH–当数据集中的字段有此注解时,且用户A和B同时操作此字段,当A先保存数据集后,在B保存前会先刷新数据集中关联的字段,然后再进行保存。
    • CascadeType.ALL–包含以上所有级联操作,注意因包含级联删除,所以使用时考虑是否要有级联删除操作。
    • orphanRemoval–当数据集中的字段有此注解时,若值为false,则做更新操作时会将不再关联的字段中的数据集id置null,从数据集中找不到字段了,但值为true时,这些不再关联的字段会从数据库中删除

实例

  • 数据集

    @Entity@Table(name = "DATA_SET_DEF")public class DataSetDef extends BaseDomain implements Serializable {private static final long serialVersionUID = 1L;/** * 字段定义 */@OneToMany(mappedBy = "dataSetDef", cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE })private List<FieldDef> fieldDefs;/** * 数据集分类分享信息 */@OneToMany(mappedBy = "dataSetDef", cascade = CascadeType.REMOVE)@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)private List<DataSetInfo> dataSetInfoes;//getter/setter.....
  • 字段

    @Entity@Table(name = "DATA_SET_DEF_FIELD")public class FieldDef extends DimensionValue implements Cloneable, Serializable {private static final long serialVersionUID = 1L;/** * 所属数据集 */@ManyToOne@JoinColumn(name = "DATA_SET_DEF_ID")@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)private DataSetDef dataSetDef;//getter/setter...
  • 数据集分享信息

    @Entity@Table(name = "DATA_SET_INFO")public class DataSetInfo extends BaseDomain implements Serializable {private static final long serialVersionUID = 1L;/** * 数据集 */@ManyToOne@JoinColumn(name = "DATA_SET_DEF_ID")private DataSetDef dataSetDef;//getter/setter...
  • 说明:数据集和字段是一对多关系,当操作数据集时需要将其字段也进行级联保存、更新、删除,所以在数据集的字段属性上添加级联注解,将字段数组放到数据集中,保存数据集时自动保存字段。在字段一侧不存在单独的保存,字段都是依赖数据集进行操作的,所以在字段一侧不需要配置级联操作。同样,新建、更新数据集时不需要对数据集分享信息进行保存,所以不添加PERSIT, MERGE,但删除数据集时相应的数据集分享也就没有存在的意义了,需要级联删除。

mappedBy的作用和关系删除

  • 用来表示谁作为主控方。主控方的意思是删除要由谁来操作,当含有级联关系时,只有作为主控方的一方才能进行删除,非主控方是无法删除含有级联关系的对象的。
    • 例如:一对多关系中,一个学生对应一个班级,一个班级有多个学生,在学生中保存班级的id,当学生作为主控方时,可以删除学生对象,此学生和班级的关系也自动删除,注意是删除关系,但是班级是非主控方,删除班级时必须先把其中的学生都删除后才能删除班级,直接删除班级是无法将和学生的关联关系也删除的(关联关系的删除意思是关联的class_id=null)
  • mappedBy=“xxx”,这个xxx所代表的类即为非主控方,mappedBy写在主控方的类中,mappedBy写在哪个属性上面哪个属性就为主控方。
  • 一般一对多关联会有主控方的设置,但如果想双方都可以进行删除,即可以把关联关系删除掉,那么mappedBy就不能写了,而是换成主控方一样的@JoinColumn(name = “CLASS_ID”),这样双方删除的时候都可以将本身删除并将关联关系置null(此处应用于用户中关联了某个组织关系,用户中有组织id,删除用户没问题,但是删除组织就要用这种配置方式了)
原创粉丝点击