2011-11-17 9 views
21

私はJava Beanで多対多の関係を持っています。私が好きなように私の変数を定義する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(リストには重複があり設定されている可能性があるため、パフォーマンスやその他の問題については何故でしょうか)に使用する多対多リレーションシップを使用する場合は、

答えて

52

リレーショナルデータベースの観点から見ると、これはセットです。データベースは順序を保持しておらず、Listを使用することは無意味です。(というインデックス付きコレクションを使用していない限り)その順序は不定です。

Setを使用すると、パフォーマンスに大きな影響があります。 Listが使われるとき、Hibernateはいくつかのひどい特徴を持つPersistentBagコレクションを使います。つまり、新しい関係を追加すると、既存の関係をすべて削除して、新しいものと新しいものとを挿入します。 Setを指定すると、新しいレコードが挿入されます。

第三の事 - あなたはは、同時に複数の袋に例外を取得することはできません悪名高いでしょうように、1つのエンティティに複数のList Sを持つことはできません。

も参照してください:

+0

良いデザインパターンのために 'List'の代わりに' Set'を使うべきでしょうか?(1対1、多数対1対1対多) – kamaci

+0

はい、 'List'は、項目が順序付けされていないことを示唆しています。私は知っている、私はそれが少し簡単APIを知っている。 –

+3

の両方が、詳細情報と良好なリンクのための回答として受け入れている。 – kamaci

3

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

+1

リストにもこの制限があります。なぜなら、hibernateはリスト内で順序を保持する必要があるため、すべての項目 –

関連する問題