美文网首页框架学习Java学习笔记Java服务器端编程
【简单易懂】JPA概念解析:CascadeType(各种级联操作

【简单易懂】JPA概念解析:CascadeType(各种级联操作

作者: 三汪 | 来源:发表于2017-08-10 20:36 被阅读8140次

    本文阅读时间5分钟。由作者三汪首发于简书。

    更多JPA实体映射相关内容请查阅:


    【在一切开始之前,我要先告诉大家:慎用级联关系,不要随便给all权限操作。应该根据业务需求选择所需的级联关系。否则可能酿成大祸。切记】

    • CascadeType.PERSIST
      官方文档的说明:Cascade persist operation
      看到网上很多博客对这一枚举值的解释是:级联持久化(保存)操作(持久保存拥有方实体时,也会持久保存该实体的所有相关数据。)
      我的内心OS是:妈蛋。我也知道是级联persist操作啊关键是怎么操作啊。妈蛋。拥有方实体是个什么玩意儿,该实体又是个什么玩意儿。
      经过实践检验,我的理解是:给当前设置的实体操作另一个实体的权限。这个理解可以推广到每一个CascadeType。因此,其余CascadeType枚举值将不再一一详细解释。
      For example:
    public class Student {
        @ManyToMany(cascade=CascadeType.PERSIST,fetch=FetchType.LAZY)
        private Set<Course> courses = new HashSet<>();
        //其他代码略。
    }
    

    可以看到,我们在上面的代码中给了Student对Course进行级联保存(cascade=CascadeType.PERSIST)的权限。此时,若Student实体持有的Course实体在数据库中不存在时,保存该Student时,系统将自动在Course实体对应的数据库中保存这条Course数据。而如果没有这个权限,则无法保存该Course数据。

    • CascadeType.REMOVE
      Cascade remove operation,级联删除操作。
      删除当前实体时,与它有映射关系的实体也会跟着被删除。
    • CascadeType.MERGE
      Cascade merge operation,级联更新(合并)操作。
      当Student中的数据改变,会相应地更新Course中的数据。
    • CascadeType.DETACH
      Cascade detach operation,级联脱管/游离操作。
      如果你要删除一个实体,但是它有外键无法删除,你就需要这个级联权限了。它会撤销所有相关的外键关联。
    • CascadeType.REFRESH
      Cascade refresh operation,级联刷新操作。
      假设场景 有一个订单,订单里面关联了许多商品,这个订单可以被很多人操作,那么这个时候A对此订单和关联的商品进行了修改,与此同时,B也进行了相同的操作,但是B先一步比A保存了数据,那么当A保存数据的时候,就需要先刷新订单信息及关联的商品信息后,再将订单及商品保存。(来自良心会痛的评论)
    • CascadeType.ALL
      Cascade all operations,清晰明确,拥有以上所有级联操作权限。

    以上。
    希望我的文章对你能有所帮助。
    有什么意见、见解或疑惑,欢迎留言讨论。

    相关文章

      网友评论

      • 053be058825f:你好,请问一下,什么版本的Hibernate使用CascadeType.PERSIST才会新增不存在的数据?😳
        我使用的Hibernate版本是4.3.5RELEASE,只有使用了CascadeType.ALL才会在保存时新增对应数据,如果只使用CascadeType.PERSIST就无法新增对应的数据。
        请问这是Hibernate版本造成的吗?
      • 克罗克达尔:写的简单清晰明了
      • 夏不见秋:我实体中这样配置:
        一的一方 CascadeType.ALL
        多的一方CascadeType.MERGE

        当我删除多的一方,他把我一的一方也删除了。这属于正常现象嘛?
        三汪:不正常。一的一方应该还在的
      • 3018a01e315e:谢谢,很喜欢您关于jpa的文章,期待您发表更多!
        三汪:@DH镔 谢谢您的肯定
      • 不平凡的小黄宁:简洁易懂,谢了
      • a11a21634ee8:CascadeType.REFRESH : 假设场景 有一个订单,订单里面关联了许多商品,这个订单可以被很多人操作,那么这个时候A对此订单和关联的商品进行了修改,与此同时,B也进行了相同的操作,但是B先一步比A保存了数据,那么当A保存数据的时候,就需要先刷新订单信息及关联的商品信息后,再将订单及商品保存
        三汪::pray: 多谢解惑

      本文标题:【简单易懂】JPA概念解析:CascadeType(各种级联操作

      本文链接:https://www.haomeiwen.com/subject/rovhrxtx.html