Java Spring boot hibernate删除级联数据

Posted

技术标签:

【中文标题】Java Spring boot hibernate删除级联数据【英文标题】:Java Spring boot hibernate delete cascade data 【发布时间】:2017-09-25 22:10:03 【问题描述】:

我在从 db 中正确删除数据时遇到问题。 我在我的 Spring Boot 应用程序中使用 Hibernate orm,现在是我想从数据库中删除用户的时刻。但是有现实,一些表包含父表用户的外键。如何删除所有链接的数据在哪里是外键? 这是我的所有表:以及带有键的列的名称:

- User - id
- Workers - id(fk)
- Resetkeys - userId(fk)
- UserRole - userId(fk)
- Tokens - userId(fk)

以及如何使用所有这些数据删除用户? 感谢您的帮助!

【问题讨论】:

您没有提及您的实体关系。你是如何映射它们的? cascade 政策或其他东西是什么? 【参考方案1】:

您是否在模型中使用了关系注释? 像这样,

@OneToMany(cascade = CascadeType.REMOVE)

参考规范https://docs.oracle.com/cd/E19798-01/821-1841/bnbqm/index.html

【讨论】:

我使用了 cascade = CascadeType.ALL 我已将其更改为 CascadeType.REMOVE,不起作用,还添加到删除级联表中【参考方案2】:

已编辑

在不参考 Spring 或 Hibernate 等框架的情况下,您可以简单地设置具有外键列约束的数据库表,以便在删除“用户”记录时删除所有相关记录。该约束称为ON DELETE CASCADE,如果在连接表的外键列上定义它,RDBMS将自动删除所有外键与被删除记录的选定用户ID匹配的记录。

尝试专门针对您正在使用的数据库服务器对 ON DELETE CASCADE 约束进行一些研究,以了解更多详细信息。

(编辑#2) 这是来自mysql documentation 的修改示例:

CREATE TABLE product (
  category INT NOT NULL, id INT NOT NULL,
  price DECIMAL,
  PRIMARY KEY(category, id)
)   ENGINE=INNODB;

CREATE TABLE customer (
  id INT NOT NULL,
  PRIMARY KEY (id)
)   ENGINE=INNODB;

CREATE TABLE product_order (
  no INT NOT NULL AUTO_INCREMENT,
  product_category INT NOT NULL,
  product_id INT NOT NULL,
  customer_id INT NOT NULL,

  PRIMARY KEY(no),
  INDEX (product_category, product_id),
  INDEX (customer_id),

  FOREIGN KEY (product_category, product_id)
    REFERENCES product(category, id)
    ON DELETE CASCADE,

  FOREIGN KEY (customer_id)
    REFERENCES customer(id)
)   ENGINE=INNODB;

该示例显示了productproduct_order 之间的关系。当从product表中删除一条记录时(只需运行DELETE FROM product WHERE id=... and category=...),product_order表中所有引用的记录都会被自动删除,无需任何额外的SQL语句。 另一方面,当从customer 表中删除一行时,您将得到与现在相同的错误,因为在这种情况下,默认约束限制了对记录的删除操作。

【讨论】:

感谢您的回答。你能为我的数据编写示例查询吗,我在上面的代码中提到过?谢谢!【参考方案3】:

例如;

 DELETE FROM progress FROM progress INNER JOIN offices ON progress.RegNo = offices.RegNo WHERE offices.ProjectID = :id;
    DELETE FROM offices WHERE offices.ProjectID = :id;
    DELETE FROM workrooms WHERE workrooms.ProjectID = :id;

NB:使用参数将值传递给查询,而不是直接将值添加到字符串中。如果你不这样做,你可以将你的代码暴露给 SQL 注入。所以你要注意一些。我想通过一个例子来解释这里的办公室和房间。

【讨论】:

【参考方案4】:

在删除操作之前和之后禁用和重新启用外键约束怎么样?

alter table Resetkeys nocheck constraint all
delete from Resetkeys ...
alter table Resetkeys check constraint all

【讨论】:

没有。 DELETE 有什么操作吗? 我添加了所有表的名称你为什么使用 MyTable @johnson 表不允许您删除具有外键约束的记录。我做了什么: - 我禁用了对表中约束的检查(Resetkeys),然后在再次删除记录后我打开了约束检查。这是一个示例,如果您觉得有帮助,您可以对所有表格执行此操作。

以上是关于Java Spring boot hibernate删除级联数据的主要内容,如果未能解决你的问题,请参考以下文章

6.Spring+Struts+Hibernat注解方式整合

Spring Boot 各版本的Java版本要求

Spring Boot . 2 -- 用Spring Boot 创建一个Java Web 应用

如何 JUnit 测试 Spring-Boot 的 Application.java

markdown Spring Boot #SpringBoot #Spring #Java

springboot使用hibernate validator