Java Spring启动hibernate删除级联数据

时间:2017-09-25 22:10:03

标签: java sql spring hibernate orm

我在从数据库中删除数据时遇到了问题。 我在我的春季启动应用程序中使用Hibernate orm,现在是我想从db中删除用户的时刻。但是有重新组合,一些表包含父表用户的外键。如何删除链接所在的所有数据? 以下是我的所有表:以及带键的列的名称:

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

如何删除所有这些数据的用户? 谢谢你的帮助!

4 个答案:

答案 0 :(得分:0)

如何在dlete操作之前和之后禁用和重新启用外键约束。

select  recipe_id,recipe_name,recipe_weight,recipe_aprox_price,recipe_raiting,recipe_calories,recipe_user_id,recipe_kcategory_id,recipe_fcategory_id,recipe_published_date,comp_id, comp_name,comp_weight,comp_description,comp_calories,comp_recipe_id from public.recipe_store INNER JOIN public.recipe_components ON (public.recipe_store.recipe_id=public.recipe_components.comp_recipe_id)

答案 1 :(得分:0)

(的被修改

如果没有对Spring或Hibernate这样的框架的任何引用,您可以简单地设置具有外键列约束的数据库表,以便在" user"时删除所有相关记录。记录被删除。约束称为ON DELETE CASCADE,如果在连接表的外键列上定义约束,则RDBMS将自动删除外键与已删除记录的选定用户ID匹配的所有记录。

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

编辑#2 ) 以下是Mexico's central

中的已修改示例
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表中删除一行时,您将得到与现在相同的错误,因为在这种情况下,默认约束会限制对记录的删除操作。

答案 2 :(得分:0)

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

@OneToMany(cascade = CascadeType.REMOVE

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

答案 3 :(得分:0)

例如;

 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;

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