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