>>分享孙卫琴的Java技术专稿和著作 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 15284 个阅读者 刷新本主题
 * 贴子主题:  【持久化专题】JPA API的级联操作 回复文章 点赞(0)  收藏  
作者:sunweiqin    发表时间:2021-05-05 11:07:38     消息  查看  搜索  好友  邮件  复制  引用

本文参考《精通JPA与Hibernate:Java对象持久化技术详解》,作者:孙卫琴,清华大学出版社出版
                      
在JPA API中,javax.persistence.CascadeType类中定义了一些常量,分别表示特定的级联操作:
  • CascadeType.PERSIST :当通过EntityManager的persist()方法来保存当前对象时,会级联保存所有关联的新建的临时对象。
  • CascadeType.REMOVE :当通过EntityManager的remove()方法来删除当前持久化对象时,会级联删除所有关联的持久化对象。
  • CascadeType.DETACH :当通过EntityManager的detach()方法来从持久化缓存中清除当前对象时,会级联清除所有关联的对象。
  • CascadeType.MERGE :当通过EntityManager的merge()方法来融合当前对象时,会级联融合所有关联的对象。
  • CascadeType.REFRESH :当通过EntityManager的refresh()方法刷新当前对象时,会级联刷新所有关联的对象。
  • CascadeType.ALL 包含了以上所有的级联操作行为。
当通过注解来映射持久化类时,如果希望使用底层Hibernate的一些级联特性,那么还可以使用org.hibernate.annotations. CascadeType类的一些常量,例如:
  • org.hibernate.annotations.CascadeType.LOCK:当通过底层Session的lock()方法把当前游离对象加入到持久化缓存中时,会把所有关联的游离对象也加入到持久化缓存中。
  • org.hibernate.annotations.CascadeType.REPLICATE:当通过底层Session的replicate()方法复制当前对象时,会级联复制所有关联的对象。
  • org.hibernate.annotations.CascadeType.SAVE_UPDATE:当通过底层Session的save()、update()及saveOrUpdate()方法来保存或更新当前对象时,会级联保存所有关联的新建的临时对象,并且级联更新所有关联的游离对象。
例如以下@OneToMany注解的cascade属性的取值为“org.hibernate.annotations.CascadeType.SAVE_UPDATE”:      

  @OneToMany (mappedBy = "parentCategory" ,
  targetEntity =Category . class )

@org .hibernate .annotations . Cascade (
  org .hibernate .annotations .CascadeType .SAVE_UPDATE )

private Set  <Category > childCategories  =  new  HashSet  <Category > ( 0 ) ;

   Category类是具有自身双向关联的类,它的childCategories属性以及parentCategory属性,进行了如下映射:      

  @OneToMany (mappedBy = "parentCategory" ,
             targetEntity =Category . class ,
             cascade =CascadeType .ALL ,
             fetch =FetchType .EAGER )
private Set  <Category > childCategories  =  new  HashSet  <Category > ( 0 ) ;   //子商品类别

@ManyToOne (targetEntity  =Category . class ,
            cascade =CascadeType .ALL ,
            fetch =FetchType .EAGER )
@JoinColumn (name = "CATEGORY_ID" )
private Category parentCategory ;   //父商品类别

   对于以上两个属性,它们的级联操作都是CascadeType.ALL,这意味着对当前的Category对象进行特定操作时,会对所关联的父类别Category对象,以及所关联的所有子类别Category对象进行同样的级联操作。
另外,为了保证从数据库中加载一个Category对象时,会立即加载所关联的父类别和子类别Category对象,采用了立即检索策略:FetchType.EAGER。
点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小


程序猿的技术大观园:www.javathinker.net





[这个贴子最后由 admin 在 2021-10-09 10:41:32 重新编辑]
  Java面向对象编程-->按面向对象开发的基础范例
  JavaWeb开发-->Web运作原理(Ⅰ)
  JSP与Hibernate开发-->Java对象持久化技术概述
  Java网络编程-->Socket用法详解
  精通Spring-->Vue Router路由管理器
  Vue3开发-->虚拟DOM和render()函数
  【Vue.js技术专题】路由导航中抓取数据
  【Vue.js技术专题】CSS中DOM元素的过渡模式
  【Spring Cloud Alibaba专题】ShardingSphere核心概念
  【Spring Cloud Alibaba专题】按照集群模式搭建Redis集群
  【持久化专题】为什么JPA和Hibernate的持久化方法都抛出运行...
  【Spring专题】用AOP和SLF4J输出日志的范例
  【持久化专题】从JPA API中获得Hibernate API
  【持久化专题】@Enumerated注解映射枚举类型
  【持久化专题】JPA API的基本用法
  【持久化专题】映射Bag包(值类型的集合)
  【Java编程基础专题】用Scanner类读取用户在控制台输入的数据
  【Java网络编程专题】用java.net.URL类访问HTTP服务器读取网...
  【Java网络编程专题】盘点用Java抓取HTTP服务器和FTP服务器的...
  【持久化专题】比较JPA的EntityManager接口与Hibernate的Ses...
  【Java基础编程专题】Java基本类型和引用类型的三个区别
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。