【发布时间】: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