我有以下实体模型。
@Entity
@Table(name="product")
public class ProductEntity {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
private UUID id;
...
@OneToMany(mappedBy = "productEntity", cascade = CascadeType.ALL)
private List<ProductAddonEntity> productAddonEntities;
}
@Entity
@Table(name="product_addon")
public class ProductAddonEntity {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
private UUID id;
...
@ManyToOne()
@JoinColumn(name = "addon_id")
private ProductEntity addonEntity;
}
我想删除产品,该删除还应删除与此产品相关的所有ProductAddon实体。因此,我声明了与所有级联类型的一对多关系。但是,当我尝试删除某些产品时,在开始时,Hibernate试图在product_addon表中设置null addon_id。但是此列有非锁定约束,因此删除失败。
所以我添加了注释@manytoone参数
@JoinColumn(name = "addon_id", nullable = false, updatable = false)
但是现在Hibernate只是尝试删除产品,然后删除与此产品连接的Product_Addon实体。由于外键约束,此删除失败(无法删除或更新父行:外键约束失败)。
这里有什么问题?该应用程序还使用Liquibase,因此不是由Hibernate生成的外键。例如,Addon_ID的外键在删除上没有操作,但是我认为Hibernate不需要这些操作,因为它在更高的数据层上工作
孤儿的删除是积极的删除级联模式,只要需要删除父对象(@onetoone和@onetomany关系)。此功能来自JPA 2.0版本。JPA删除操作
两种设置之间的区别是响应断开关系的响应。例如,例如将地址字段设置为null或其他地址对象时。
@Entity
class Employee {
@OneToOne(cascade=CascadeType.REMOVE)
private Address address;
}
如果仅cascade = cascadeType.emove被指定,没有自动操作,因为断开关系不是删除操作。
@Entity
class Employee {
@OneToOne(orphanRemoval=true)
private Address address;
}
如果指定了orphanremoval = true,则自动删除断开的地址实例。这对于清理没有所有者对象的引用(例如员工)的依赖对象(例如地址)很有用。