HibernateでのID要素およびプライマリキー生成


マッピングされたクラスは、対応するデータベース・テーブルのプライマリ・キー・フィールドを定義する必要があります.ほとんどのクラスにはJavaBeansスタイルのプロパティがあり、各インスタンスに一意のIDが含まれています.要素は、この属性をデータベース・テーブルのプライマリ・キー・フィールドにマッピングすることを定義します.
<id
        name="propertyName"                                          (1)
        type="typename"                                              (2)
        column="column_name"                                         (3)
        unsaved-value="null|any|none|undefined|id_value"             (4)
        access="field|property|ClassName"                            (5)
        node="element-name|@attribute-name|element/@attribute|.">

        <generator class="generatorClass"/>
</id>

(1)
name(オプション):属性の名前を識別します.
(2)
type(オプション):Hibernateタイプの名前を識別します.
(3)
column(オプション-デフォルトはプロパティ名):プライマリ・キー・フィールドの名前.
(4)
unsaved-value(オプション-デフォルトはフィールド判定(sensible)の値):インスタンスが作成されたばかりで、保存されていないことを示す特定の識別属性値.これは、このようなインスタンスと、以前のセッションからロードされた(修正された可能性がある--訳者注)が、再び永続化されていないインスタンスを区別することができる.
(5)
アクセス(オプション-デフォルトはproperty):Hibernateが属性値にアクセスするためのポリシー.
name属性が存在しない場合、このクラスには属性が識別されていないと考えられます.
unsaved-valueプロパティが重要です!クラスの識別プロパティが通常のJavaデフォルト(nullまたはゼロ)でない場合は、正しいデフォルト値を指定する必要があります.
もう1つの定義は、旧式のマルチプライマリ・キー・データにアクセスできる.私たちはこの方法を強くお勧めしません.
Generator
オプションのサブ要素は、永続化クラスのインスタンスに一意の識別を生成するJavaクラスの名前です.このジェネレータインスタンスにいくつかの構成値または初期化パラメータが必要な場合は、要素で渡されます.
<id name="id" type="long" column="cat_id">
        <generator class="org.hibernate.id.TableHiLoGenerator">
                <param name="table">uid_table</param>
                <param name="column">next_hi_value_column</param>
        </generator>
</id>

すべてのジェネレータがnet.sf.hibernate.id.IdentifiierGeneratorインタフェース.これは非常に簡単なインタフェースです.一部のアプリケーションでは、独自の実装を提供することを選択できます.もちろん、Hibernateは多くの組み込み実装を提供しています.ビルダー内蔵のショートカット名は次のとおりです.
increment
long、short、またはintタイプに一意の識別を生成するために使用します.他のプロセスが同じテーブルにデータを挿入しない場合にのみ使用できます.クラスタの下では使用しないでください.
identity
DB 2、MySQL、MS SQL Server、Sybase、HypersonicSQLの内蔵IDフィールドをサポートします.返される識別子はlong、shortまたはintタイプです.
sequence
DB 2、PostgreSQL、Oracle、SAP DB、McKoiではシーケンスを使用し、Interbaseではジェネレータを使用します.返される識別子はlong、shortまたはintタイプです.
hilo
高/低位アルゴリズムを用いてlong,shortまたはintタイプの識別子を効率的に生成する.上位値のソースとして、テーブルおよびフィールド(デフォルトはhibernate_unique_keyおよびnext_hi)が与えられます.高/低ビットアルゴリズムによって生成される識別子は、特定のデータベースでのみ一意です.
seqhilo
高/低位アルゴリズムを使用して、long、shortまたはintタイプの識別子を効率的に生成し、データベースシーケンス(sequence)の名前を指定します.
uuid
128ビットのUUIDアルゴリズムを使用して文字列タイプの識別子を生成します.これは、ネットワーク内で一意です(IPアドレスが使用されています).UUIDは32ビット16進数の文字列として符号化される.
guid
MS SQL ServerおよびMySQLでデータベースを使用して生成されたGUID文字列.
native
下位データベースのコンピテンシーに基づいてidentity、sequence、hiloのいずれかを選択します.
assigned
アプリケーションにsave()の前にオブジェクトにラベルを割り当てさせます.これは要素が指定されていない場合のデフォルトの生成ポリシーです.
select
データベース・トリガで一意のプライマリ・キーの行を選択し、プライマリ・キー値を返してプライマリ・キーを割り当てます.
foreign
別の関連オブジェクトの識別子を使用します.通常はと組み合わせて使用されます.
 
高/低位アルゴリズム(Hi/LO Algorithm)
hiloとseqhiloジェネレータは,満足できる識別子生成アルゴリズムである2つのhi/loアルゴリズムの実装を与えた.1つ目のインプリメンテーションでは、次の使用可能なhi値を保存するために「特殊」なデータベース・テーブルが必要です.2つ目のインプリメンテーションは、サポートされている場合に1つのOracleスタイルのシーケンスを使用します.
<id name="id" type="long" column="cat_id">
        <generator class="hilo">
                <param name="table">hi_value</param>
                <param name="column">next_value</param>
                <param name="max_lo">100</param>
        </generator>
</id>
<id name="id" type="long" column="cat_id">
        <generator class="seqhilo">
                <param name="sequence">hi_value</param>
                <param name="max_lo">100</param>
        </generator>
</id>

残念ながら、Hibernate自身にConnectionを提供するときにhiloを使用することはできません.HibernateがJTAを使用してアプリケーションサーバのデータソース接続を取得する場合は、hibernateを正しく構成する必要があります.transaction.manager_lookup_class.
UUIDアルゴリズム(UUID Algorithm)
UUIDには、IPアドレス、JVMの起動時間(正確には1/4秒)、システム時間、カウンタ値(JVMで一意)が含まれます.JavaコードではMACアドレスやメモリアドレスを取得することは不可能なので、JNIを使用しない前提でできることが最善の実現です.
フィールドとシーケンスの識別(Identity columns and Sequences)
識別フィールドを内部でサポートするデータベース(DB 2、MySQL、Sybase、MS SQL)では、identityキーを使用して生成できます.内部サポートシーケンスのデータベース(DB 2、Oracle、PostgreSQL、Interbase、McKoi、SAP DB)では、sequenceスタイルのキーワードを使用して生成できます.この2つの方法は、新しいオブジェクトを挿入するためにSQLクエリを2回必要とします.
<id name="id" type="long" column="person_id">
        <generator class="sequence">
                <param name="sequence">person_id_sequence</param>
        </generator>
</id>
<id name="id" type="long" column="person_id" unsaved-value="0">
        <generator class="identity"/>
</id>

プラットフォーム間開発の場合、nativeポリシーはidentity、sequence、hiloから選択され、下位データベースのサポート能力に応じて選択されます.
フリップフロップ実装のプライマリ・キー・ジェネレータ(Primary keys assigned by triggers)
残されたschemaにのみ使用される(Hibernateはトリガを使用してDDLを生成できない).
<id name="id" type="long" column="person_id">
        <generator class="select">
                <param name="key">socialSecurityNumber</param>
        </generator>
</id>

上記の例では、クラスは、person_という名前の自然キー(natural key)であるsocialSecurityNumberという名前の一意の値属性を定義しています.idのプロキシキーの値はトリガによって生成される.