ヒベルナのコレクションタイプ


  • Collectionタイプ:
  •  
    Hibenrateの中のペアは多くて、多対多関係の中で、Collectionは比較的に重要な地位を占めています。Hibernateでは、いくつかのタイプのCollectionがサポートされていますか?彼らの違いは何ですか?
    Hibernateに関わるCollectionタイプ(伝統的なjava Set、Map、Listは要求を満たすことができません。Hibernateはこれらのインターフェースによって自分の実現を提供しています。以下のSet、Bag、MapはいずれもHIbernateにおける実現を指します。)があります。
    1,無秩序集合:Set,Bag,Map;
    2,秩序結合:List;
    無秩序と秩序は、HIbenateデータの持続過程において、データセットにおける記録配列順序を維持するか否かを区別するものである。順序付けされたセットのデータは、HIbernateが永続化する過程で、セット内の要素の順序付けの順序を同時にデータベースに固化し(特定のフィールド値の格納順序で)、読み込むと、同じ順序のデータセットが返されます。
     
  • set
  •  
    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オブジェクトの中にSetbook属性があります。追加する時にBookを5冊追加しました。hibernateは、5つのBookオブジェクトを作成し、TURERのSet<Book>bookのセットに入れて返します。この5つのbookに記録されている論理内容が完全に同じであっても(idが違っています)。これは、エンティティオブジェクトを通してマッピングされるもので、Stringを介してbookテーブルのフィールドをマッピングすると、問題が発生します。マッピングのタイプをStringに変更します。ヒベルナは一つのレコードだけを作って返します。(java.lang.Stringは二つの文字列の内容を比較します。このように比較すると5つのbookの内容は同じです。Setの中に同じ値が出てはいけません。そうすると、1つの記録が保存されます。)濡れを追加すると、削除も同じエラーが発生します。
    Setデータタイプのこの面での制限を補完するために、HIbernateはBagタイプを提供する。
     
  • Bag
  • Bag:Hibernateカスタムの集合タイプで、重複要素を含むことができる「set」を実現しました。その下の層はリスト実装に接触していますが、Listの秩序を遮断しています。「bag」宣言のデータセットを通して、その元素の順序付けは永続化されません。
    私達がセットをに変えた時;同じbookを入れても、データベースに3つの記録を追加します。
    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
  • Mapも無秩序な集合タイプであり、Set/Bagタイプとは違って、Mapは値/キーの対応関係を提供している。一つのMapの構成例は以下の通りである。
    		<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
  • Listは、集合内の要素の順序の持続化を実現し、Mapのセットは追加のフィールドのキー値を保存する必要があるように、ライブラリには対応するフィールドを割り当てて順序の情報を保存しなければならない。1つのListの構成例は以下の通りである。
    		<list name="books" lazy="true" table="_books">
    			<key column="user_id"/>
    			<index type="integer" column="idx"/>
    			<element type="string" column="books"/>
    		</list>
     ノードでは、「idx」フィールドで順序状態を保存することを指定します。