是否可以将“删除级联时”添加到由 Hibernate 管理的表中?

2022-09-02 10:56:21

我有一些由Hibernate管理的表,具有各种外键约束。删除时的级联目前由Hibernate单独管理。为了处理测试数据,我经常手动创建和删除一些行。如果我可以将ON DELETE级联添加到外键约束中,那将对我帮助很大,但我不知道Hibernate是否在此之上,因为数据库在Hibernate之前删除了一些东西。


很多人似乎都专注于DDL。我的目的不是指示Hibernate使用SQL DELETE CASCADES创建DDL。我只是想知道,如果我在数据库中指定一个 ON DELETE 级联,除了在引用注释上有 JPA 之外,它是否会造成任何伤害,例如, .cascade = CascadeType.REMOVE@ManyToOne


答案 1

可以使用 ,但是此注释仅适用于 中的对象,而不适用于数据库中的对象。您希望确保将其添加到数据库约束中。要进行验证,可以将 JPA 配置为生成 ddl 文件。看一下文件,你会发现这不是约束的一部分。添加到文件中的实际 SQL,然后从 ddl 更新数据库架构。这将解决您的问题。CascadeType.DELETEEntityManagerON DELETE CASCADEddlON DELETE CASCADEON DELETE CASCADEddl

链接显示了如何在 MySQL 中使用 on 。在约束上执行此操作。您也可以在 or 语句中执行此操作。JPA 很可能在语句中创建约束。只需添加该语句即可。ON DELETE CASCADECONSTRAINTCREATE TABLEALTER TABLEALTER TABLEON DELETE CASCADE

请注意,某些 JPA 实现器确实为此功能提供了一种方法。

Hibernate确实使用注释提供了此功能,因此,如果您想坚持使用标准JPA功能,最好使用它或简单地更新ddl文件。@OnDelete


答案 2

只要您没有或没有启用,就可以安全地使用,以防止实体删除事件的传播。ON DELETE CASCADECascadeType.REMOVEorphanRemoval

建立您的关系将强制休眠为相关的外键生成。但是,您必须指出,通过返回方法支持此类关系。@OnDelete(action = OnDeleteAction.CASCADE)ON DELETE CASCADEDialecttruesupportsCascadeDelete

Dialect.supportCascadeDelete()

删除时


推荐