【问题标题】:Hibernate: Problem with cascade delete for one to many relation休眠:一对多关系的级联删除问题
【发布时间】:2019-07-31 23:19:06
【问题描述】:

我有以下实体模型。

@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 不需要这些操作,因为它适用于更高的数据层

【问题讨论】:

    标签: sql hibernate hibernate-cascade


    【解决方案1】:

    孤儿删除是一种激进的删除级联模式,用于在需要删除父对象时删除子对象(@OneToOne 和 @OneToMany 关系)。 此功能从 JPA 2.0 版本添加。JPA deletion operation

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

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

    如果仅指定 cascade=CascadeType.REMOVE,则不会执行自动操作,因为断开关系不是删除操作。

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

    如果指定了 orphanRemoval=true,则断开连接的 Address 实例将被自动删除。这对于清理在没有所有者对象(例如 Employee)的引用时不应该存在的依赖对象(例如地址)很有用。

    【讨论】:

    • 不幸的是,orphanRemoval 对我没有帮助。 Hibernate 仍然尝试在 product_addon 之前删除产品
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2015-08-01
    • 2015-05-31
    相关资源
    最近更新 更多