我有以下实体模型。
@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)
但是现在休眠只是尝试删除产品,然后再删除与该产品相关的 product_addon 实体。由于外键约束,此删除失败(无法删除或更新父行:外键约束失败)。
这里有什么问题?此应用程序还使用 liquibase,因此外键不是由 hibernate 生成的。例如,addon_id 的外键没有删除操作,但我认为休眠不需要这些操作,因为它适用于更高的数据层