1

我有一个测试套件,需要为系统中的大量(但不是全部)表删除本地 MySQL 测试实例中的任何现有数据。

 delete from customer;

当然,customer它有不少外键,所以我还必须删除更多的表......

 delete from customer_email;
 delete from customer_phone;

再一次,这些表有更多的外键......

 delete from customer_email_notification;
 delete from customer_phone_call;

等等等等令人作呕。为了编写测试设置,不得不在精神上浏览整个数据模型是令人沮丧的。

我正在使用 Hibernate,所以我想知道是否有某种方法可以自动获取表的优先顺序列表,以便可以直接将其传递给删除处理程序。理想情况下:

 List<String> dependentTables = foreignKeyGraph.findAll("customer");
 deletionHandler.clean(dependentTables);

是否有一个 Hibernate 实用程序可以做到这一点?我打算写一些遍历我们域的注释和派生表名的东西,但是对于一个相当普遍的问题似乎需要做很多工作。谢谢!

4

1 回答 1

0

处理此问题的一个好方法是在每个表上使用 DELETE 触发器。在 CUSTOMER 表上,将有一个触发器来删除所有相关数据,方法是跟踪每个与给定 CUSTOMER_ID 的 CUSTOMER 相关的外键 - 同样对于与 CUSTOMER 相关的每个表 - 以及与这些表相关的每个表,等等。所以例如,如果 CUSTOMER_EMAIL 表通过 CUSTOMER_ID 和 CUSTOMER_PHONE 关联回 CUSTOMER,那么 CUSTOMER 上的删除触发器可能看起来像

CREATE TRIGGER CUSTOMER_AD  -- AD = After Delete
  AFTER DELETE ON CUSTOMER
  FOR EACH ROW
BEGIN
  DELETE FROM CUSTOMER_EMAIL E WHERE E.CUSTOMER_ID = :NEW.CUSTOMER_ID;
  DELETE FROM CUSTOMER_PHONE P WHERE P.CUSTOMER_ID = :NEW.CUSTOMER_ID;
END CUSTOMER_AD;

分享和享受。

于 2010-10-18T21:13:54.453 回答