web-dev-qa-db-ja.com

多対多の関係セットまたはリストを休止状態にしますか?

Java beans。Listを使用して変数を次のように定義すると、多対多の関係になります。

@Entity
@Table(name="ScD")
public class Group extends Nameable {

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER)
    @JoinColumn(name="b_fk")
    private List<R> r;
    //or
    private Set<R> r;

そのエラーが発生します:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0'
...

Setを使用すると、すべてがうまく機能しているようです。

多対多の関係を使用する場合、論理概念ListまたはSetにどちらを使用するかを尋ねたいと思います(リストに重複や設定がある可能性があるためですが、パフォーマンスやその他の問題はどうですか?)

24
kamaci

リレーショナルデータベースの観点からは、これはセットです。データベースは順序を保持せず、Listを使用しても意味がなく、データベース内の順序は指定されていません(いわゆるインデックス付きコレクションを使用しない限り)。

Setを使用すると、パフォーマンスにも大きな影響があります。 Listが使用される場合、Hibernateはその下にあるPersistentBagコレクションを使用します。これにはいくつかのひどい特性があります。つまり、新しい関係を追加すると、最初に既存の関係がすべて削除され、次にそれらと新しい関係が挿入されます。 Setを使用すると、新しいレコードを挿入するだけです。

3番目のこと-悪名高い複数のバッグの例外を同時にフェッチできないため、1つのエンティティに複数のListを含めることはできません。

参照:

60

セットからの一意性要件はどうですか?これにより、Hibernateは、コレクションにオブジェクトが追加されるたびにすべてのオブジェクトを取得して、新しく追加されたオブジェクトが一意であることを確認しませんか?リストにはこの制限はありません。

3
Marc

質問が何年も前に行われたことは知っていますが、誰かがセットとリストの問題について疑わしい場合に備えて、このトピックについてコメントしたいと思います。

遅延フェッチに関しては、回避するという事実から、バッグ(インデックスのないリスト)の方が適していると思います。コレクションにオブジェクトが追加されるたびに、次の目的ですべてのオブジェクトを取得します。

  • setを使用している場合は、新しく追加されたものが一意であることを確認してください
  • リスト(インデックス付き)を使用している場合は、順序を保持します

間違えたら訂正してください。

0
onofricamila