したがって、結合テーブルによってリンクされた双方向の多対多の関係を持つFile
との2 つのクラスがあります。FileSet
FILE_FILE_SET
1 つのファイルを複数のファイルセットの一部にすることができ、その逆も可能です。FileSet への変更は、@ManytoMany(cascade = CascadeType.All)
注釈を介して個々のファイルにカスケードされます (ただし、その逆はできません)。特に、FileSet で 1000 個を超えるファイルに遭遇することは珍しくありません。これらのクラスのコードは稼働していますが、FileSet から個々のファイルを削除しようとすると問題が発生します。削除は正しく行われますが、セット内のファイルの数が増えると、削除にかかる時間は O に比例します。 (n^2)。これは、FileSet-File 関連付けを削除するための現在のコードが、FileSet のインスタンスを取得し、File を削除してから、更新された FileSet をSaveOrUpdate()
で保存するためです。これにより、関連するすべてのファイルが保存されます。
これは小さなセットでは問題ありませんが、FileSet に多くのファイルがある場合は制限的に遅くなります。残念ながら、FileSet オブジェクトは、カスケードが適切なコード内の他の多くのポイントで保存されるため、カスケードを完全にオフにすることは避けたいと思います。
だから、私の実際の質問に到達するには:休止状態で2つのオブジェクト間の特定の関連付けを削除する方法はありますか? たとえば、結合テーブルからエントリを削除するために実行できる HQL クエリはありますか?