我可以在Hibernate管理的表中添加"ON DELETE CASCADE"吗?

mus*_*iKk 15 java sql hibernate jpa

我有一些由Hibernate管理的表,有各种外键约束.Cascade on delete目前仅由Hibernate管理.为了解决测试数据,我经常手动创建和删除一些行.如果我可以将ON DELETE CASCADE添加到外键约束中,这对我有很大的帮助,但我不知道Hibernate是否因为数据库在Hibernate之前删除了东西而绊倒了.


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

cmd*_*cmd 5

您可以使用CascadeType.DELETE,但是此注释仅适用于 中的对象EntityManager,而不适用于数据库。您要确保将ON DELETE CASCADE其添加到数据库约束中。要验证,您可以配置 JPA 以生成 ddl 文件。查看ddl文件,您会注意到它ON DELETE CASCADE不是约束的一部分。添加ON DELETE CASCADEddl文件中的实际 SQL ,然后从 ddl 更新您的数据库架构。这将解决您的问题。

链接显示了如何在 MySQL 中使用ON DELETE CASCADEfor CONSTRAINT。您在约束上执行此操作。您也可以在CREATE TABLEorALTER TABLE语句中执行此操作。JPA 很可能在ALTER TABLE语句中创建了约束。只需添加ON DELETE CASCADE到该语句中即可。

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

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


Boh*_*nko 5

ON DELETE CASCADE只要您没有CascadeType.REMOVEorphanRemoval启用了阻止实体删除事件传播的功能,您就可以安全地使用。

拥有@OnDelete(action = OnDeleteAction.CASCADE)您的关系将迫使 Hibernate 生成ON DELETE CASCADE相关的外键。但是,您必须表明返回方法Dialect支持这种关系。truesupportsCascadeDelete

Dialect.supportsCascadeDelete()

删除时