0

したがって、結合テーブルによってリンクされた双方向の多対多の関係を持つFileとの2 つのクラスがあります。FileSetFILE_FILE_SET

1 つのファイルを複数のファイルセットの一部にすることができ、その逆も可能です。FileSet への変更は、@ManytoMany(cascade = CascadeType.All)注釈を介して個々のファイルにカスケードされます (ただし、その逆はできません)。特に、FileSet で 1000 個を超えるファイルに遭遇することは珍しくありません。これらのクラスのコードは稼働していますが、FileSet から個々のファイルを削除しようとすると問題が発生します。削除は正しく行われますが、セット内のファイルの数が増えると、削除にかかる時間は O に比例します。 (n^2)。これは、FileSet-File 関連付けを削除するための現在のコードが、FileSet のインスタンスを取得し、File を削除してから、更新された FileSet をSaveOrUpdate()で保存するためです。これにより、関連するすべてのファイルが保存されます。

これは小さなセットでは問題ありませんが、FileSet に多くのファイルがある場合は制限的に遅くなります。残念ながら、FileSet オブジェクトは、カスケードが適切なコード内の他の多くのポイントで保存されるため、カスケードを完全にオフにすることは避けたいと思います。

だから、私の実際の質問に到達するには:休止状態で2つのオブジェクト間の特定の関連付けを削除する方法はありますか? たとえば、結合テーブルからエントリを削除するために実行できる HQL クエリはありますか?

4

1 に答える 1

2

まず第一に、ManyToXxx 関連付けの CascadeType.ALL はあまり意味がありません。ファイルセットのファイルが別のファイルセットの一部である場合、ファイルセットを削除するときにすべてのファイルを削除する必要はありません。ファイルセットはまだ他のファイルセットによって参照されているからです。

さて、質問に答えるために、ファイルセットからファイルを削除するために何をしたいですか。これは、ファイルセット内のファイルのコレクションからファイルを削除することで簡単に実行できます。

public removeFilesFromFileSet(FileSet fileSet, Set<File> filesToRemove) {
    fileSet.getFiles().removeAll(filesToRemove);
}

ただし、これにより FileSet 内のすべてのファイルがロードされます。それが望ましくない場合は、関連付けテーブルをマップするか、SQL を使用する必要があります。

于 2012-12-14T09:15:23.393 に答える