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 に関連付けられている場合、CUSTOMER_PHONE と同様に、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 に答える