4

外部キーの 1 つを介して結合テーブル内の行をカスケード削除しようとしていますが、それに関連する別のテーブルがあり、この ID に関連付けられているすべての行も削除したいと考えています。というわけで下図のようになります。休止状態で Session.delete(reqCandObject) を使用すると、正常に動作し、candidate_jobReq テーブルから One エントリと関連するコメントを削除することでカスケードします。ただし、特定の候補IDを持つすべてのcandidate_jobReqエントリを削除したい(そしてコメントも削除したい)以下の関数を試しましたが、素敵なhibernate.delete(object)関数とは異なり、これは外部キー制約エラーに遭遇します. 休止状態で削除をカスケードさせながら、これらの行を削除するにはどうすればよいですか?

ここに画像の説明を入力

public void deleteWhere(String selectionCase){
    Session hibernateSession = this.getSession();
    try {
        hibernateSession.beginTransaction();
        Query q = hibernateSession.createQuery("delete "+ type.getSimpleName() +" where " + selectionCase);
        q.executeUpdate();
        hibernateSession.getTransaction().commit();
    } finally {
        hibernateSession.close();
    }
}
4

1 に答える 1

4

Hibernate はカスケードを内部で処理します。クエリを実行してdeleteも内部カスケードはトリガーされないため、矛盾や孤立が発生します。これを試して、外部キー制約エラーに直面した可能性があります。

子エンティティと共にエンティティのリストを削除するには、次の 2 つの方法があります。

  1. を使用してエンティティのリストを選択しselectionCaseます。リストを反復処理し、 を使用してそれぞれを個別に削除しsession.deleteます。
  2. レコードを手動で削除します。delete別々のステートメントを書きます。外部キー制約の違反を回避するには、親を削除する前に子レコードを削除する必要があります。これは、最初のオプションよりも優れたパフォーマンスを発揮します。
于 2013-10-04T16:29:58.827 に答える