複数のデータベースエンジン(Oracle、MSSQL、MySQL)をサポートする製品に取り組んでいます。 Oracleの場合、大量のインストールで並行性とロックの問題が発生する可能性を回避するために、シーケンステーブルではなくシーケンスを使用したいと思いますが、他のデータベースエンジンはシーケンスをサポートしていません。さらに、グローバルシーケンス(_hibernate_sequence
_など)ではなく、テーブルごとに1つのシーケンスを使用したいので、@GeneratedValue(strategy = GenerationType.AUTO)
は機能しません。実行時に戦略を動的に選択する方法はありますか?
実際、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は、一般にかなり構成可能です。詳細については、javadocsをご覧ください: http://docs.jboss.org/hibernate/orm/4.1/javadocs/index.html?org/hibernate/id/enhanced/SequenceStyleGenerator.html