ヒベルナのコレクションタイプ
Hibenrateの中のペアは多くて、多対多関係の中で、Collectionは比較的に重要な地位を占めています。Hibernateでは、いくつかのタイプのCollectionがサポートされていますか?彼らの違いは何ですか?
Hibernateに関わるCollectionタイプ(伝統的なjava Set、Map、Listは要求を満たすことができません。Hibernateはこれらのインターフェースによって自分の実現を提供しています。以下のSet、Bag、MapはいずれもHIbernateにおける実現を指します。)があります。
1,無秩序集合:Set,Bag,Map;
2,秩序結合:List;
無秩序と秩序は、HIbenateデータの持続過程において、データセットにおける記録配列順序を維持するか否かを区別するものである。順序付けされたセットのデータは、HIbernateが永続化する過程で、セット内の要素の順序付けの順序を同時にデータベースに固化し(特定のフィールド値の格納順序で)、読み込むと、同じ順序のデータセットが返されます。
HIbernate Setは、java CollectionにおけるSetに関する定義に従う。すなわち、セットにおいて同じ要素が2つ出現してはいけない。
TUser user = new TUser();
user.setName("keith");
set.add(user);
set.add(user);
System.out.println("user size:"+user.size());
二回のadd()動作を実行したが、Set構造には一つの参照しか含まれていない。
ハイベルナーは、関連するオブジェクトのセットに戻ると、自動的に各レコードのエンティティオブジェクトを構築します。例えば、TUserオブジェクトの中にSet
Setデータタイプのこの面での制限を補完するために、HIbernateはBagタイプを提供する。
私達がセットを
bag集合は無秩序集合であり、重複要素が出現することを許可し、問題をもたらします。ある元素を削除する時、私達はどのようにこの記録を位置決めしますか?データベースには同じ要素が複数存在していますので、bagの実現方法は、実際にはライブラリテーブルの中原にある集合データを全部削除して、既存のデータを逐条挿入していますが、この方式のデータ更新の性能は低いです。このような場合、セット内の各要素に一つのidがあると、対応するデータベースレコードを一意に検索することができる。
IDBagが現れて、bagの延長の一つとして、この問題を解決できます。
<idbag name="books" lazy="true" table="_books">
<collection-id type="int" column="id">
<generator class="identy"></generator>
</collection-id>
<key column="user_id" />
<element type="string" column="books"/>
</idbag>
もっと詳しいのはhibernate公式文書を見ることができます。 <map name="books" lazy="true" table="_books">
<key column="user_id"/>
<index type="string" column="type"/>
<element type="string" column="books"/>
</map>
set構成と比較して、MapはKeyとしてのフィールド名を指定するための<index>構成を追加し、このフィールドはデータセット内の唯一の値を求める。 <list name="books" lazy="true" table="_books">
<key column="user_id"/>
<index type="integer" column="idx"/>
<element type="string" column="books"/>
</list>