回答:
APIのドキュメントは、この上で非常に明確です。
すべてのジェネレータはorg.hibernate.id.IdentifierGeneratorインターフェースを実装します。これは非常にシンプルなインターフェースです。一部のアプリケーションは独自の特殊な実装を提供することを選択できますが、Hibernateはさまざまな組み込み実装を提供します。組み込みジェネレータのショートカット名は次のとおりです。
インクリメント
他のプロセスが同じテーブルにデータを挿入していない場合にのみ一意である、long、short、またはint型の識別子を生成します。クラスタでは使用しないでください。
身元
DB2、MySQL、MS SQL Server、Sybase、およびHypersonicSQLのID列をサポートします。返される識別子は、long、short、またはint型です。
シーケンス
DB2、PostgreSQL、Oracle、SAP DB、McKoiのシーケンス、またはInterbaseのジェネレータを使用します。返される識別子は、long、short、またはint型です
ヒロ
hi値のソースとしてテーブルと列(デフォルトではそれぞれhibernate_unique_keyとnext_hi)を指定すると、hi / loアルゴリズムを使用してlong、short、またはint型の識別子を効率的に生成します。hi / loアルゴリズムは、特定のデータベースに対してのみ一意の識別子を生成します。
seqhilo
名前付きデータベースシーケンスを指定すると、hi / loアルゴリズムを使用して、long、short、またはint型の識別子を効率的に生成します。
UUID
128ビットUUIDアルゴリズムを使用して、ネットワーク内で一意の文字列型の識別子を生成します(IPアドレスが使用されます)。UUIDは、長さが32桁の16進数の文字列としてエンコードされます。
GUID
MS SQL ServerおよびMySQLでデータベースが生成したGUID文字列を使用します。
ネイティブ
基礎となるデータベースの機能に応じて、ID、シーケンス、またはhiloを選択します。
割り当てられた
save()が呼び出される前に、アプリケーションでオブジェクトに識別子を割り当てることができます。要素が指定されていない場合、これがデフォルトの戦略です。
選択する
一意のキーで行を選択し、主キーの値を取得することにより、データベーストリガーによって割り当てられた主キーを取得します。
外国人
別の関連オブジェクトの識別子を使用します。通常、主キーの関連付けと組み合わせて使用されます。
シーケンスID
実際の値の生成にデータベースシーケンスを利用しますが、これをJDBC3 getGeneratedKeysと組み合わせて、生成された識別子の値をinsertステートメントの実行の一部として返す、特殊なシーケンス生成戦略。この戦略は、JDK 1.4を対象とするOracle 10gドライバーでのみサポートされます。これらの挿入ステートメントに関するコメントは、Oracleドライバーのバグのため無効になっています。
同時ユーザーが少ない単純なアプリケーションを構築している場合は、増分、ID、HILOなどを使用できます。これらは設定が簡単で、DB内でのコーディングはあまり必要ありませんでした。
データベースに応じて、シーケンスまたはGUIDを選択する必要があります。id
生成はデータベース内で行われるため、これらは安全で優れています。
更新: 最近、idendityに問題がありました。代わりにwarapperタイプ(整数)を使用することで、プリミティブタイプ(int)が修正されました。
基本的に、2つの主要な選択肢があります。
@GeneratedValue
アノテーションを使用すると、HibernateがIDを割り当てます。生成された識別子には、2つのオプションがあります。
数値識別子の場合、3つのオプションがあります。
IDENTITYは、JDBCバッチ更新が無効になるため、 SEQUENCE(MySQLなど)を使用できない場合にのみ選択できます。
SEQUENCEは、特にpooledやpooled-loなどの識別子オプティマイザーで使用する場合に推奨されるオプションです。
TABLEは別のトランザクションを使用して識別子と行レベルのロックをフェッチするため、スケーリングが不十分であるため、いかなる場合でも避けてください。
少し前に、Hibernateキージェネレーターに関する詳細な記事を書きました:http : //blog.eyallupu.com/2011/01/hibernatejpa-identity-generators.html
正しいジェネレーターを選択することは複雑な作業ですが、できるだけ早く正しく実行することは重要です。移行が遅れると悪夢になることがあります。
少し外れたトピックですが、アプリケーション間で(APIを介して)キーを共有するという、見落とされがちなポイントを上げる良いチャンスです。個人的には常に代理キーを好んでおり、オブジェクトを他のシステムと通信する必要がある場合は、(代理キーであっても)キーを公開しません。追加の「外部キー」を使用します。コンサルタントとして、オブジェクトキーを使用した「優れた」システム統合(「それがあればすぐに使用できる」アプローチ)を2回以上見たことがあります。内部キーを公開するシステムでの深い移行が必要な種類。キーを公開することは、コードの基本的な側面を外部の制約に公開することを意味します。
この講義は非常に価値のあるhttps://vimeo.com/190275665であることがわかります。ポイント3では、これらのジェネレータを要約し、それぞれを使用する際のパフォーマンス分析とガイドラインを示します。