@OneToMany List <>とSet <>の違い


94

使っても違いはありますか

@OneToMany
public Set<Rating> ratings;

または私が使うなら

@OneToMany
public List<Rating> ratings;

どちらも問題なく動作しますが、リストとセットの違いはわかりますが、これにより、休止状態(またはJPA 2.0)がそれを処理する方法に違いがあるかどうかはわかりません。

回答:


109

インデックス列が指定されていない場合、リストはHibernateによってバッグとして処理されます(特定の順序はありません)。

Hibernateの処理における1つの注目すべき違いは、1つのクエリで2つの異なるリストをフェッチできないことです。たとえばPerson、連絡先のリストと住所のリストを持つエンティティがある場合、単一のクエリを使用して、すべての連絡先とすべての住所を持つ人物をロードすることはできません。この場合の解決策は、(デカルト積を回避する)2つのクエリを作成するか、少なくとも1つのコレクションに対してのSet代わりにを使用することですList

エンティティを定義する必要がequalsありhashCode、エンティティに不変の機能キーがない場合、Hibernateでセットを使用することはしばしば困難です。


3
また、リストで発生することの詳細については、stackoverflow.com / q / 1995080/2495717を参照してください。
ben3000

31

リストを使用する場合は、getter関数で 'Order BY'句を指定できます。セットでそれを行うことはできません。order by句には部分的なEJBQLを含めることができます。例えば

@OneToMany
@OrderBy("lastname ASC")
public List<Rating> ratings;

このフィールドを空白のままにすると、リストは主キーの値に基づいて昇順でソートされます。


19
それは私に私のHibernateドキュメントのスクランブルを送ったので、あなた @Sortセットすることができます- ドキュメントでSortedSet説明されているよう使用するだけです。
mabi 2013

ただし、SortedSetを使用すると、コンパレータで並べ替えられます。データベースの "order by"で並べ替える方法はありません。
samir105

古い回答ですので、はっきりさせておきたいと思います。現在、我々は、使用することができます@OrderBySet。その下で、HibernateはOrderedSetTypeをインスタンス化するLinkedHashSetを使用するため、順序は保持されます。さらに、私はLinkedHashSetエンティティで使用することをお勧めします-一貫性のため。出典:discourse.hibernate.org/t/...
マーティン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.