2011-12-08 22 views
4

次の要件を満たすHibernate IDジェネレータを使用することにしました。 - ドメインが異なるアプリケーション(異なるJVM)からアクセスされるときの安全なID生成 - ID間隔を使用しますデータベースに新しいIDが必要になるたびに)私は2休止強化識別子ジェネレータのいずれかを選択し、いくつかの調査の後Hibernate。拡張識別子ジェネレータ

、それは

org.hibernate.id.enhanced.TableGenerator

です

問題は、このアルゴリズムは次の値が利用可能ではなく、次の利用可能な区間の終わりをデータベースに保持することです。つまり、私がIDを要求したときにincrement_size 10のIDジェネレータがあるとしましょう。 1 - 10ですが、データベースには値11ではなく21が格納されます。この動作では、特定のテーブルにマップされているすべてのクラスに沿ってincrement_sizeを同じに保つ必要があります。なぜこの動きがあるのですか?これを修正する方法はありますか?

+0

特定のテーブルへのエンティティマッピングは1つだけにしてください。 –

+0

@JBNizet:継承のために複数のマッピング/クラスが同じデータベーステーブルを指し示すことができる状況があります。 –

+0

継承はルートエンティティで定義されたジェネレータを使用します。したがって、実際には有効ではありません。そして、一般的に私は人々が一歩後退して、サロゲート*キーの全目的を考える必要があると思います。定義上、値はビジネス上の意味を持たないはずですから、なぜあなたは気にしますか? –

答えて

4

org.hibernate.id.enhanced.TableGeneratorは、複数の値を同時に生成できるテーブルを定義します。複数のエンティティの単一の値から識別子を生成させようとしているように思えます。これは、それを利用したい場合は、 'segment_value' TableGenerator設定の設定によって制御されます。

値は「修正」するものはありません。その壊れていない。動作が異なる場合は、異なる動作を設定します。これは、TableGeneratorの 'optimizer'設定の設定で定義されたオプティマイザによって制御されます。これはすべてマニュアルに記載されています。http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#mapping-declaration-id「5.1.2.3。拡張識別子ジェネレータ」と「5.1.2.3.1。識別子ジェネレータ最適化」のセクションを参照してください。このマニュアルでは、使用可能なすべてのオプティマイザについては言及していません。あなたが欲しいもののような音は "pooled-lo"と呼ばれ、 "pooled"のようですが、高い値ではなくlo値を保存します。

+0

設定エラーです。もちろん、一緒にうまく働くために同じ値のプールを使って2つのものを設定する必要があります... –

+0

あなたと議論するつもりはありません。あなたは尋ねた...私はあなたがしたいことをする方法を答えた。それを取るか、それを残す... –

1

この投稿は古いですが、同じ種類の問題がある可能性のある投稿です。

Steve Ebersole氏の指摘によれば、 "pooled-lo"オプティマイザを使用する必要があります。 以前のバージョンにissueがあったので、あなたの休止状態のバージョンもチェックしてください。> = 4.3.11。

いくつか説明すると、pooled-loオプティマイザでは、データベースに格納されている値は、使用可能な次のインターバルの低い値です。

永続化された最後のエンティティのIDが[1; 10]の場合、使用可能な次の間隔は[11,20]で、データベースに格納されている値は11になります。

したがって、hibernateを使用せず、hibernate設定で定義されたインクリメントサイズを認識していない別のプログラムがある場合でも、シーケンスを破ることなくエンティティを挿入することができます。

シーケンス値をアトミックに取得してインクリメントし、挿入する新しいエンティティIDとして値retrieve(「インクリメント」の前)を使用するだけです。 この例では、1行を挿入するために、シーケンス値を12に更新し、id11の新しいエンティティを追加します。 したがって、hibernateは現在の間隔の最後のIDにメモリ(10)に到達します。 id [12; 21]の新しい間隔を自己保持するために、データベースに問い合わせ、値22を保存する。

関連する問題