HibernateのとコレクションSet
の主な違いは何ですか?Bag
どのシナリオで使用する必要がSet
ありBag
ますか?
4 に答える
A<bag>
は順序付けられていないコレクションであり、重複した要素を含めることができます。つまり、要素のいくつかの順序でバッグを永続化する場合、コレクションが取得されたときに同じ順序が保持されることは期待できません。Javaコレクションフレームワークには「バッグ」の概念がないため、にjava.util.List
対応するを使用し<bag>
ます。
Aは、一意のオブジェクトのみを格納できること<set>
を除いて、に似ています。<bag>
つまり、重複する要素をセットに含めることはできません。同じ要素を2回目にセットに追加すると、古い要素が置き換えられます。セットはデフォルトでは順序付けされていませんが、並べ替えを依頼することができます。Javaの対応するタイプは。ですjava.util.Set
。
例
マッピング<set>
<set name="employees" table="employee"
inverse="true" lazy="true" fetch="select">
<key>
<column name="department_id" not-null="true" />
</key>
<one-to-many class="net.viralpatel.hibernate.Employee" />
</set>
マッピング<bag>
<bag name="employees" table="employee"
inverse="true" lazy="true" fetch="select">
<key>
<column name="employee_id" not-null="true" />
</key>
<one-to-many class="net.viralpatel.hibernate.Employee" />
</bag>
したがって、両方ともhbmファイルでまったく同じ方法でマップされます。ただし、重複レコードの処理方法のみが異なります。
Hibernateリファレンスから:
バッグは重複する要素値を許可し、インデックス列がないため主キーを定義できないため、最悪のケースです。Hibernateには、重複する行を区別する方法がありません。
そしてまた:
ただし、バッグやリストの方がセットよりもはるかにパフォーマンスが高いという特定のケースがあります。
inverse="true"
たとえば、標準の双方向の1対多の関係イディオムを使用したコレクションの場合、バッグ要素を初期化(フェッチ)することなく、バッグまたはリストに要素を追加できます。
さまざまなコレクション間のクイックサマリーの違いは次のとおりです
- セット-重複なし、順序なし
バッグ-重複を含めることができ、注文なし(別名、順序なしリスト、または重複のあるセット)
リスト-重複を含めることができますが、順序は保持されます
- 順序を維持するために@OrderByを使用して作成できます
どちらも順序付けられていないコレクションです。バッグは複製を許可します。セットはしません。