孙卫琴的《精通JPA与Hibernate》的读书笔记:JPA API的级联操作

本文详细介绍了JPAAPI中javax.persistence.CascadeType的级联操作,包括PERSIST、REMOVE、DETACH、MERGE、REFRESH和ALL等。同时,提到了Hibernate的额外级联类型如LOCK、REPLICATE和SAVE_UPDATE。在示例中,展示了如何在@OneToMany和@ManyToOne注解中设置级联操作,并使用FetchType.EAGER实现即时加载关联对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java技术集锦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值