20

複数のデータベースエンジン(Oracle、MSSQL、MySQL)をサポートする製品に取り組んでいます。Oracleの場合、大量インストールでの潜在的な同時実行とロックの問題を回避するために、シーケンステーブルではなくシーケンスを使用したいと思いますが、他のデータベースエンジンはシーケンスをサポートしていません。hibernate_sequenceさらに、グローバルシーケンス(など)ではなく、テーブルごとに1つのシーケンスを使用したいので、機能し@GeneratedValue(strategy = GenerationType.AUTO)ません。実行時に戦略を動的に選択する方法はありますか?

4

1 に答える 1

38

実際、Hibernate は と の両方GenerationType.AUTOを解釈GenerationType.SEQUENCEし、そのorg.hibernate.id.enhanced.SequenceStyleGenerator. SequenceStyleGenerator は、基礎となるデータベースがサポートするものに基づいて 2 つの戦略のいずれかを選択する ID 生成戦略です。データベースがシーケンスをサポートしている場合、SequenceStyleGenerator はシーケンスを使用します。そうでない場合、SequenceStyleGenerator は「シーケンス テーブル」の使用にフォールバックします。使用するジェネレーターのこの「マッピング」は、設定によって制御されますhibernate.id.new_generator_mappings。これを true に設定すると、先ほど説明した動作が有効になります。残念ながら、下位互換性の理由から、これをデフォルトで false にする必要がありました。そのため、これを利用するには、設定が true に設定されていることを確認する必要があります。

さらに、名前が指定されていない場合は、SequenceStyleGenerator をグローバル シーケンスまたはエンティティごとのシーケンスのいずれかを優先するように構成できます。これは、という名前の設定によって制御されますprefer_sequence_per_entity

SequenceStyleGenerator は、一般的に非常に構成可能です。詳細については、Javadoc を参照してください: http://docs.jboss.org/hibernate/orm/4.1/javadocs/index.html?org/hibernate/id/enhanced/SequenceStyleGenerator.html

于 2012-10-05T01:18:28.690 に答える