24

HibernateのとコレクションSetの主な違いは何ですか?Bagどのシナリオで使用する必要がSetありBagますか?

4

4 に答える 4

25

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ファイルでまったく同じ方法でマップされます。ただし、重複レコードの処理方法のみが異なります。

出典:Hibernate1対多XMLチュートリアル

于 2012-12-12T16:06:18.223 に答える
7

Hibernateリファレンスから:

バッグは重複する要素値を許可し、インデックス列がないため主キーを定義できないため、最悪のケースです。Hibernateには、重複する行を区別する方法がありません。

そしてまた:

ただし、バッグやリストの方がセットよりもはるかにパフォーマンスが高いという特定のケースがあります。inverse="true"たとえば、標準の双方向の1対多の関係イディオムを使用したコレクションの場合、バッグ要素を初期化(フェッチ)することなく、バッグまたはリストに要素を追加できます。

于 2012-12-11T08:53:08.653 に答える
6

さまざまなコレクション間のクイックサマリーの違いは次のとおりです

  • セット-重複なし、順序なし
  • バッグ-重複を含めることができ、注文なし(別名、順序なしリスト、または重複のあるセット)

  • リスト-重複を含めることができますが、順序は保持されます

    • 順序を維持するために@OrderByを使用して作成できます
于 2018-01-17T05:28:37.967 に答える
2

どちらも順序付けられていないコレクションです。バッグは複製を許可します。セットはしません。

于 2012-12-11T01:39:08.223 に答える