2012-10-04 11 views
14

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

答えて

22

実際には、HibernateはGenerationType.AUTOGenerationType.SEQUENCEの両方をorg.hibernate.id.enhanced.SequenceStyleGeneratorで解釈します。 SequenceStyleGeneratorは、基礎となるデータベースがサポートするものに基づいて2つの戦略のうちの1つを選択する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

+0

どのように構成可能です、私はまだSequenceStyleGeneratorのincrement_sizeを変更する方法の一例を見つけるのですか? configureメソッドに渡されるparamsは、cfg.xmlで設定されたプロパティのセットが限定されています。オプティマイザとincrement_sizeは私の努力の最善を尽くすために渡されません。 –

+2

'@SequenceGenerator(...、allocationSize = blah)' –

+0

提案していただきありがとうございます。しかし、SequenceGeneratorはSequenceStyleGeneratorで述べられているのと同じプロパティを持っていないので、これはショートカットのようです。 私はこれを試してプールド・オプティマイザと連携し、私が期待していたパフォーマンス・エッジを私に与えました。 しかし、閉鎖のため。 cfg.xmlファイルでこれを行う方法はありますか? SequenceStyleGenerator.javaの "optimizer"と "increment_size"は、デバッグ中にhibernateによって読み込まれませんでした。 http://stackoverflow.com/questions/19694154/hibernate-cfg-xml-configuration-for-sequence-generator –

関連する問題