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;
该示例显示了product
和product_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 . 2 -- 用Spring Boot 创建一个Java Web 应用
如何 JUnit 测试 Spring-Boot 的 Application.java