java - 我可以将 'ON DELETE CASCADE' 添加到 Hibernate 管理的表中吗?

标签 java sql hibernate jpa

我有一些由 Hibernate 管理的具有各种外键约束的表。 Cascade on delete 目前由 Hibernate 单独管理。为了处理测试数据,我经常手动创建和删除一些行。如果我可以将 ON DELETE CASCADE 添加到外键约束中,这将对我有很大帮助,但我不知道 Hibernate 是否会遇到这个问题,因为数据库会在 Hibernate 之前删除内容。


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

最佳答案

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

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

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

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

关于java - 我可以将 'ON DELETE CASCADE' 添加到 Hibernate 管理的表中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19686941/

相关文章:

java - 如何使用Hibernate缓存表数据并加速查询?

java - 警告 : org. springframework.web.servlet.PageNotFound - 在名称为 'appServlet' 的 DispatcherServlet 中未找到带有 URI [/board/] 的 HTTP 请求的映射

Java - 如何转换 JSON 字符串中的值(删除非字符串上的引号)?

mysql - 带有左连接的一个查询中的多个计数 - 按什么分组?

mysql - Cakephp电子商务数据库设计

java - 如何使用外键插入新记录?

java - 为什么当我在 NetBeans 中运行 wathever 程序时,system.out.println() 部分会出现类未识别的情况

java - MongoDB Java 插入抛出无法找到类 org.variabel.BsonDocument 的编解码器

mysql - 使用另一个 SELECT 更新表,但字段为 SUM(someField)

java - JPA, hibernate : find throws NullPointerException