Hibernateコレクションマッピング規則
48761 ワード
本文は主にHibernate高級集合マッピング(Advanced collection mappings)を紹介し、Hibernate高級集合マッピングは主に秩序集合、双方向関連、双方向関連に分けられ、秩序集合クラス、三重関連(Ternary associations)、使用に関連する.1.秩序集合(Sorted collections)
Hibernateプレミアムコレクションマッピングはjavaの実装をサポートする.util.SortedMapとjava.util.SortedSetの集合.マッピングファイルでコンパレータを指定する必要があります.
sort属性で許容する値にはunsorted,natural,および実装javaが含まれる.util.Comparatorのクラスの名前.
分類集合の行為は実際にjavaに似ている.util.TreeSetまたはjava.util.TreeMap.
データベースがコレクション要素を独自にソートする場合は、set、bag、mapマッピングのorder-byプロパティを使用します.この解決策はjdk 1に限られる.4以上のjdkバージョンでのみ実現できます(LinkedHashSetまたはLinkedHashMapによって実現されます).メモリではなくSQLクエリーでソートを完了します.
注意:このorder-byプロパティの値は、HQLではなくSQLソート句です.
関連付けは、実行時に集合filter()を使用して任意の条件に従ってソートすることもできます.
2.双方向関連(Bidirectional associations)
双方向の関連付けでは、関連付けられたいずれかの端から別の端にアクセスできます.Hibernateでは、2つのタイプの双方向の関連付けがサポートされています.
◆一対多(one-to-many)Setまたはbag値は一端、個別値(非集合)は他端
◆マルチペアマルチ(many-to-many)両端がsetまたはbag値
双方向のマルチペアマルチ関連付けを確立するには、2つのmany-to-manyを同じデータベース・テーブルに関連付けてマッピングし、その一端をinverseとして定義します(どの一端を使用するかは選択に従いますが、インデックス・セットではありません).
ここにはmany-to-manyの双方向関連の例がある.各categoryには多くのitemsがあり、各itemsは多くのcategoriesに属することができます.
関連する逆エンドのみを変更した場合、この変更は永続化されません.これは、Hibernateが、AからBに接続され、BからAに接続された双方向の関連付けごとにメモリに2回の表現があることを示しています.Javaオブジェクトモデルを思い出すと、Javaで多対多関係を作成する方法がわかりやすくなります.
非反転端子は、メモリの表示をデータベースに保存するために使用されます.
1対の複数の双方向関連付けを作成するには、1対の複数の関連付けを1対の複数の関連付けとして同じテーブルのフィールドにマッピングし、「複数」の一端にinverse=「true」を定義します.
「一」の端でinverse=「true」を定義してもカスケード操作には影響しません.両者は直交する概念です.
3.双方向関連、秩序化集合クラスに関する
一端が
Hibernateプレミアムコレクションマッピングはjavaの実装をサポートする.util.SortedMapとjava.util.SortedSetの集合.マッピングファイルでコンパレータを指定する必要があります.
- <set name="aliases"
- table="person_aliases"
- sort="natural">
- <key column="person"/>
- <element column="name" type="string"/>
- </set>
-
- <map name="holidays" sort="my.custom.HolidayComparator">
- <key column="year_id"/>
- <map-key column="hol_name" type="string"/>
- <element column="hol_date" type="date"/>
- </map>
sort属性で許容する値にはunsorted,natural,および実装javaが含まれる.util.Comparatorのクラスの名前.
分類集合の行為は実際にjavaに似ている.util.TreeSetまたはjava.util.TreeMap.
データベースがコレクション要素を独自にソートする場合は、set、bag、mapマッピングのorder-byプロパティを使用します.この解決策はjdk 1に限られる.4以上のjdkバージョンでのみ実現できます(LinkedHashSetまたはLinkedHashMapによって実現されます).メモリではなくSQLクエリーでソートを完了します.
- <set name="aliases" table="person_aliases" order-by="lower(name) asc">
- <key column="person"/>
- <element column="name" type="string"/>
- </set>
-
- <map name="holidays" order-by="hol_date, hol_name">
- <key column="year_id"/>
- <map-key column="hol_name" type="string"/>
- <element column="hol_date" type="date"/>
- </map>
注意:このorder-byプロパティの値は、HQLではなくSQLソート句です.
関連付けは、実行時に集合filter()を使用して任意の条件に従ってソートすることもできます.
- ssortedUsers = s.createFilter( group.getUsers(), "order by this.name" ).list();
2.双方向関連(Bidirectional associations)
双方向の関連付けでは、関連付けられたいずれかの端から別の端にアクセスできます.Hibernateでは、2つのタイプの双方向の関連付けがサポートされています.
◆一対多(one-to-many)Setまたはbag値は一端、個別値(非集合)は他端
◆マルチペアマルチ(many-to-many)両端がsetまたはbag値
双方向のマルチペアマルチ関連付けを確立するには、2つのmany-to-manyを同じデータベース・テーブルに関連付けてマッピングし、その一端をinverseとして定義します(どの一端を使用するかは選択に従いますが、インデックス・セットではありません).
ここにはmany-to-manyの双方向関連の例がある.各categoryには多くのitemsがあり、各itemsは多くのcategoriesに属することができます.
- <class name="Category">
- <id name="id" column="CATEGORY_ID"/>
- ...
- <bag name="items" table="CATEGORY_ITEM">
- <key column="CATEGORY_ID"/>
- <many-to-many class="Item" column="ITEM_ID"/>
- </bag>
- </class>
-
- <class name="Item">
- <id name="id" column="CATEGORY_ID"/>
- ...
-
- <!-- inverse end -->
- <bag name="categories" table="CATEGORY_ITEM" inverse="true">
- <key column="ITEM_ID"/>
- <many-to-many class="Category" column="CATEGORY_ID"/>
- </bag>
- </class>
関連する逆エンドのみを変更した場合、この変更は永続化されません.これは、Hibernateが、AからBに接続され、BからAに接続された双方向の関連付けごとにメモリに2回の表現があることを示しています.Javaオブジェクトモデルを思い出すと、Javaで多対多関係を作成する方法がわかりやすくなります.
- category.getItems().add(item); // The category now "knows" about the relationship
- item.getCategories().add(category); // The item now "knows" about the relationship
-
- session.persist(item); // The relationship won''t be saved!
- session.persist(category); // The relationship will be saved
非反転端子は、メモリの表示をデータベースに保存するために使用されます.
1対の複数の双方向関連付けを作成するには、1対の複数の関連付けを1対の複数の関連付けとして同じテーブルのフィールドにマッピングし、「複数」の一端にinverse=「true」を定義します.
- <class name="Parent">
- <id name="id" column="parent_id"/>
- ....
- <set name="children" inverse="true">
- <key column="parent_id"/>
- <one-to-many class="Child"/>
- </set>
- </class>
-
- <class name="Child">
- <id name="id" column="child_id"/>
- ....
- <many-to-one name="parent"
- class="Parent"
- column="parent_id"
- not-null="true"/>
- </class>
「一」の端でinverse=「true」を定義してもカスケード操作には影響しません.両者は直交する概念です.
3.双方向関連、秩序化集合クラスに関する
一端が
- または