Hibernate:Cascade删除的问题是一至多个关系



我有以下实体模型。

@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,则自动删除断开的地址实例。这对于清理没有所有者对象的引用(例如员工)的依赖对象(例如地址)很有用。

相关内容

  • 没有找到相关文章

最新更新