ID生成ポリシー(xml)


Hibernateマッピングファイル(*.hbm.xml)の要素は、永続化クラスの識別子属性名、タイプ、およびデータベース・テーブルのフィールドへのマッピングを定義し、サブ要素は、現在の永続化クラスの識別子属性の生成ポリシーを設定するために使用されます.
 
永続化オブジェクトは、次のコードに示すように、データベース・テーブル内のレコードに対応します.テーブル内のレコードをより永続化するには、要素のclassプロパティ設定で使用する識別子プロパティ生成ポリシーが必要です.
<id name="id" type="java.lang.Integer" column="ID"> 
	<generator class="increment">
	</generator> 
</id>

 
要素は、識別子属性の生成に必要な1つ以上のパラメータを渡すために要素のオプションのサブ要素です.
Hibernateには複数の識別子属性生成ポリシーが内蔵、必要を満たすことができなければorgを実現することもできる.hibernate.id.IdentifierGeneratorインタフェースは、識別子属性生成ポリシーをカスタマイズする.
 
1.increment生成ポリシー
 
Hibernateがデータベース・テーブルに新しいレコードを挿入する準備をしている場合は、まずデータベース・テーブルから現在のプライマリ・キー・フィールドの最大値を取得し、最大値に1を加えて現在の永続化オブジェクトの識別子属性値とします.このポリシーはincrement生成ポリシーであり、生成された識別子属性のタイプはlong、short、intおよびそのパッケージクラスのタイプであってもよい.
 
このプライマリ・キー生成ポリシーは、単一サーバのHibernateアプリケーションに適しており、データベースもこのHibernateアプリケーションによってのみ享受されます.そうでなければ、生成された識別子属性値の一意性は保証されません.すなわち、この識別子属性生成ポリシーは、非共有データベースまたは分散型Hibernateアプリケーションには適していません.
この識別子属性を使用してポリシーを生成する構成例は、次のとおりです.
<id name="id" type="java.lang.Integer" column="ID">
	<generator class="increment">
	</generator>
</id>  

  
 2.identity生成ポリシー
 
MS SQL Server、MySQL、DB 2などのデータベースでは、テーブル内のフィールドの数値が自動的に増加するように設定できます.identity生成ポリシーは、現在のレコードにプライマリ・キー値を取得しながら、永続化オブジェクトに識別子属性値を付与します.
 
この生成ポリシーによって生成される識別子属性のタイプは、long、short、intおよびそのパッケージクラスのタイプであってもよい.
 
この識別子属性を使用してポリシーを生成する構成例は、次のとおりです.
 
<id name="id" type="java.lang.Integer" column="ID">
	<generator class="identity">
	</generator>
</id>    

 
3.sequence生成ポリシー
 
Oracle、DB 2、PostgreSQLなどのデータベースにシーケンスを作成し、Hibernateは現在のレコードのプライマリ・キー値を取得し、永続化オブジェクトに識別子属性値を付与します.これはsequence生成ポリシーであり、生成された識別子属性のタイプはlong、short、intおよびそのパッケージクラスのタイプであってもよい.
 
この識別子属性を使用してポリシーを生成する構成例は、次のとおりです.
<id name="id" type="java.lang.Integer" column="ID">
	<generator class="sequence">
		<param name="sequence">gb_seq</param> 
	</generator>
</id>  

3行目は、Hibernateが使用するシーケンス名を指定します.この動作はオプションです.シーケンス名が指定されていない場合、Hibernateのデフォルトでは、hibernate_sequenceという名前のシーケンスが使用されます.
 
4.hilo生成策
 
hilo生成ポリシーは、「高/低位」(hi/lo)と呼ばれる効率的なアルゴリズムを用いて識別子属性値を生成し、生成された識別子属性値はlong、short、intおよびそのパッケージクラスのタイプである.このアルゴリズムは、高位値(hi)と低位値(lo)を使用し、その値を計算し、演算結果を識別子属性値とする.
 
この識別子プロパティを使用してポリシーを生成するには、データベースにテーブルとフィールド(デフォルトのテーブル名は「hibernate_unique_key」、フィールド名は「next_hi」、フィールド名は数値)を上位値のソースとして確立する必要があります.この識別子属性を使用してポリシーを生成する構成例は、次のとおりです.
<id name="id" type="java.lang.Integer" column="ID">
	<generator class="hilo">
		<param name="table">hibernate_key</param>
		<param name="column">next_hivalue</param>
	</generator>
</id> 

 
この識別子属性生成ポリシーには、特定のデータベースに対して一意の識別子属性を生成することを保証する追加のデータベーステーブルおよびフィールドのサポートが必要です.また、このポリシーは、下位層で使用されるデータベースに関係なく、データベース間で使用できます.
 
5.seqhilo生成ポリシー
 
seqhilo生成ポリシーは、long、short、intおよびそのパッケージクラスのタイプの識別子属性値を生成する高/低位アルゴリズムも使用する.hilo生成ポリシーとは異なり、指定したsequenceを使用して上位値を取得します.この識別子属性を使用してポリシーを生成する構成例は、次のとおりです.
<id name="id" type="java.lang.Integer" column="ID"> 
	<generator class="seqhilo">
		<param name="sequence">hibernate_seq</param>
	</generator>
</id>

 
3行目は、Hibernateが使用するシーケンス名を指定します.この動作はオプションです.シーケンス名が指定されていない場合、Hibernateのデフォルトでは、hibernate_unique_sequenceという名前のシーケンスが使用されます.
 
6 uuid生成ポリシー
 
uuid生成ポリシーは、IPアドレス、JVMの起動時間(正確には1/4秒)、システム時間、カウンタ値(現在のJVMでは一意)を用いて計算された識別子属性値を生成する128ビットのUUIDアルゴリズムを用いて、分散型Hibernateアプリケーションで使用できる文字列タイプのプライマリ・キー値を生成する.生成された識別子属性は32ビット長の文字列です.この生成ポリシーを使用すると、永続化クラスの識別子属性に対応するタイプをStringタイプに設定する必要があります.その構成情報の例は以下のとおりです.
<id name="id" type="java.lang.String" column="ID">
	<generator class="uuid">
	</generator>
</id> 

 
この識別子属性生成ポリシーによって生成された数値は、32ビット長の文字列であるため、データベース領域が大きい複数のデータベース間の一意性を保証します.この生成ポリシーは,実際の開発で使用することを推奨する.
 
7 guid生成ポリシー
 
この識別子属性生成ポリシーは、MS SQL ServerまたはMySQLデータベースのGUID文字列を使用して識別子属性値を生成します.MS SQL Serverデータベースを使用する場合は、識別子属性に対応するフィールドタイプを「uniqueidentifier」に設定する必要があります.構成情報の例は次のとおりです.
<id name="id" type="java.lang.String" column="ID">
	<generator class="guid"> 
	</generator>
</id> 

  
 
8 native生成ポリシー
 
Hibernateは、使用するデータベースのサポート機能に基づいてidentity、sequence、hilo生成ポリシーのいずれかを選択します.構成情報の例は次のとおりです.
<id name="id" type="java.lang.Integer" column="ID">
	<generator class="native">
	</generator>
</id>  

 
この識別子属性生成ポリシーを使用すると、Oracleでsequenceを使用するなど、異なるデータベースに基づいて異なる生成ポリシーを使用できます.MySQLでidentityを使用すると、Hibernateが異なるデータベース間で移植されやすくなります.
 
9 assigned生成ポリシー
 
assigned生成ポリシーは、Hibernateによってカスタム識別子属性の数値を適用します.すなわち、Sessionオブジェクトのsave()メソッドを呼び出してオブジェクトを永続化する場合、まず永続化オブジェクトの識別子属性に値を割り当てる必要があります.
 
要素にプライマリ・キー生成ポリシーが設定されていない場合、デフォルトはassigned生成ポリシーです.構成情報の例は次のとおりです.
<id name="id" type="java.lang.Integer" column="ID">
	<generator class="assigned"></generator>
</id>    

 
 
 
10 foreign生成ポリシー
foreign生成ポリシーは、関連する永続化オブジェクトによって現在の永続化オブジェクトに識別子属性値を設定し、永続化クラスの1対1の関連付けを処理する場合、1つの永続化クラスの識別子属性値は、関連する永続化クラスの識別子属性値を参照して取得することができる.
 
たとえば、UserクラスとProfileクラスの識別子属性はidであり、両者は1対1の関連関係である.Profileクラスの識別子属性値を設定するには、Userクラスの識別子属性から取得できます.Profile.hbm.xmlファイルの識別子プロパティの設定情報は次のとおりです.
<id name="id" type="java.lang.Integer" column="ID" >
	<generator class="foreign">
		<param name="property">user</param>
	</generator>
</id> 

 
 
11識別子属性生成ポリシーの選択
 
Hibernateが提供する識別子属性生成ポリシーを選択する際、具体的な問題を具体的に分析するには、アプリケーションシステムが分散配置を必要としない場合、データベースのサポートの場合、sequence、identity、hilo、seqhilo、uuid生成ポリシーを使用するのは良い選択です.アプリケーションが複数のデータベースを使用する必要がある場合や分散型の導入が必要な場合は、uuid生成ポリシーが最適です.また、Hibernateを使用して残留システムを改造する場合は、識別子属性に一定のルールを手動で割り当てる必要がある場合があります.この場合、assigned生成ポリシーを使用するのが適切です.