web-dev-qa-db-ja.com

JPAアノテーションとHibernateを使用して@GeneratedValue戦略を動的に選択する方法はありますか?

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

19
Clay

実際、HibernateはGenerationType.AUTOGenerationType.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

31
Steve Ebersole