20.5.4. 一括削除
コレクションの要素を一つずつ削除するのは極めて非効率的になることがあります。Hibernate は新しい空のコレクションの場合(
list.clear() を呼び出した場合など)はこれをすべきでないことを知っています。この場合は、Hibernate は DELETE を一回発行します。
サイズ20のコレクションに要素を1つ追加し、それから二つの要素を削除するとします。Hibernate は、コレクションが bag でなければ、一つの
INSERT 文と二つの DELETE 文を発行します。これは確かに望ましい動作です。
しかし、18個の要素を削除して2つを残し、それから3つ新しい要素を追加するとします。このとき二つの方法があります。
- 18行を順に削除して、3行を追加する
- 一回のSQL
DELETEでコレクション全体を削除し、5つの要素すべてを一つずつ挿入します。
Hibernate はこの場合に2番目の方法が早いことはおそらく分からないでしょう。このような振る舞いはデータベースのトリガなどを混乱させる場合があるため、Hibernateがここまで直感的なのはおそらく好ましくありません。
幸いにも、元のコレクションを捨て(つまり参照をやめて)、現在の要素をすべて持つ新しいコレクションのインスタンスを返すことで、いつでもこの動作(2番目の戦略)を強制することが出来ます。
一括削除は
inverse="true" をマッピングしたコレクションに適用しません。