CascadeType.REMOVE 和 orphanRemoval 在 JPA 中有什么区别?

两者之间有什么区别

@OneToMany(cascade=REMOVE, mappedBy="customer")
public List<Order> getOrders() { ... }

@OneToMany(mappedBy="customer", orphanRemoval="true")
public List<Order> getOrders() { ... }

这个例子来自Java EE教程,但我仍然不明白细节。


答案 1

从这里:-

级联删除

使用 CascadeType.REMOVE(或 CascadeType.ALL,包括 REMOVE)标记引用字段表示删除操作应自动级联到该字段引用的实体对象(集合字段可以引用多个实体对象):

@Entity
class Employee {
     :
    @OneToOne(cascade=CascadeType.REMOVE)
    private Address address;
     :
}

孤儿删除

JPA 2 支持附加的、更激进的移除级联模式,该模式可以使用@OneToOne的 orphanRemove 元素指定,并@OneToMany注释:

@Entity
class Employee {
     :
    @OneToOne(orphanRemoval=true)
    private Address address;
     :
}

区别:-

这两个设置之间的区别在于对断开关系的响应。例如,例如,将地址字段设置为 null 或设置为另一个地址对象时。

  • 如果指定了 orphanRemoval=true,则会自动删除断开连接的地址实例。这对于清理依赖对象(例如地址)非常有用,如果没有所有者对象(例如 Employee)的引用,这些对象就不应该存在。
  • 如果仅指定了 cascade=CascadeType.REMOVE,则不会执行自动操作,因为断开关系不是删除
    操作。

答案 2

了解 和 之间区别的简单方法。CascadeType.REMOVEorphanRemoval=true

对于孤立项删除:如果调用 ,则相关实体将自动在 db 中删除。setOrders(null)Order

对于删除级联:如果调用 ,则不会在 db 中自动删除相关实体。setOrders(null)Order


推荐