6.2.3. インデックス付きのコレクション

6.2.3. インデックス付きのコレクション

set と bag を除く全てのコレクションマッピングには、コレクションテーブルの中に インデックス用のカラム が必要です。そのカラムに、配列や List のインデックス、もしくは Map のキーをマッピングします。 Map のインデックスは、 <map-key> によりマッピングされた基本型か、 <map-key-many-to-many> によりマッピングされたエンティティの関連か、あるいは <composite-map-key> によりマッピングされたコンポジット型になります。配列かリストのインデックスは、常に integer 型で、 <list-index> 要素によりマッピングします。マッピングされたカラムにはシーケンシャルな整数を格納します (デフォルトでは0から番号が付けられます)。

<list-index 
        column="column_name"
        base="0|1|..."/>

column_name (必須): コレクションインデックス値を持っているカラムの名前。

base (オプション - デフォルトは 0): リスト又は配列の1つめの要素に対応するインデックスカラムの値。

<map-key 
        column="column_name"
        formula="any SQL expression"
        type="type_name"
        node="@attribute-name"
        length="N"/>

column (オプション): コレクションインデックス値を持っているカラムの名前。

formula (オプション): マップのキーを評価するために使用される SQL 式。

class (必須): マップキーのタイプ

<map-key-many-to-many
        column="column_name"
        formula="any SQL expression"
        class="ClassName"
/>

column (オプション): コレクションインデックス値のための外部キーカラムの名前。

formula (オプション): マップキーの外部キーを評価するために使用される SQL 式。

class (必須): マップキーとして使用されるエンティティクラス。

もしテーブルにインデックスカラムがなくても、プロパティ型として List を使いたければ、 Hibernate の <bag> としてプロパティをマッピングします。 bag はデータベースから復元される時、順序を保持しません。しかし、(メモリ上で)ソートしたり、(SQLで)順序付けしたり(order by)することもできます。

多くの一般的なリレーショナルモデルをカバーしたために、コレクションのために利用できるマッピングにはかなりの幅があります。様々なマッピング宣言がどのようにデータベーステーブルに変換されるかを知るために、スキーマ生成ツールを使ってみると良いでしょう。