2011-01-31 10 views
1

私はNHibernateでhiloジェネレータを使用しています。私は今、手動で外部ソースからレコードの読み込みをインポートする必要があります。 NHが主キーで行うことを複製するには、何をする必要がありますか?SQLでhiloを生成

私たちは、以下の使用している:

私はすべてのテーブルの列「next_hi」は、単一の1列のテーブル「hibernate_unique_key」を使用しています信じて
<class name="MyClass"> 
    <id name="Id" column="Catalogue_Id"> 
     <generator class="hilo" /> 
    </id> 
    <!-- other stuff --> 
</class> 

さらに、私はhiloを読んでいて、理論を得たと思っていますが、私はそれを作成中のデータに結びつけるのに苦労しています。

私は、キー1,2,3で一つのテーブルを持っている...
他は65536、65537、65538 ...
と別の98304、98305、98306 ...
hibernate_unique_keyでnext_hiの値を持っています現在は6です。

私は明らかに分かりませんが、誰かがここで何が起こっているのか説明できますか?

+0

UPDATE:デフォルトのmax_loは32kなので、キーがどのように増加しているのかがわかりました。私はこれが私が手作業で自分のIDを生成するために必要だった情報だと思います。次のグラブを取得し、32kでそれを掛け、next_hiを+1して、計算されたIDから使用してください – DannyT

答えて

2

maxil値がInt16.MaxValue(32767)のhiloジェネレータのデフォルト設定を使用しています。データベースで見つけたnext_hiの値は、NHibernateで使用されるhiloジェネレータによって予約されている値の "ブロック"を意味します。ここで、blockはmax_loの連続値を意味します。あなたはキーは次のように生成されているため、データベース・テーブルで見つかった値があなたの例:

  1. まず発電機は、(0から32767まで)のキーの最初のブロックを予約し、1にnext_hiの値をインクリメントしています。このジェネレータは最初のテーブルから値を生成しました:1,2,3 ..ゼロは実装によって回避されるため、0のキーを取得しませんでした。
  2. 第2発電が(32768から65535まで)キーの第2のブロックを予約し、2
  3. 第発電機にhext_hiの値をインクリメントし(65536から98303まで)キーの第3のブロックを予約したとするnext_hiの値をインクリメントしました3.このジェネレータは、2番目のテーブルから値を生成しました65536、65537 ....
  4. 4番目のジェネレータはキーの4番目のブロック(98304〜131071)を予約し、next_hiの値を4に増やしました。第3テーブル98304,98305 ...

等..第6ジェネレータはnext_hiの値を6に増やし、テーブル内のe。したがって、このジェネレータとデフォルトの設定を考慮して説明した状況は正しいです。

すべてのテーブルの値を連続して取得したい場合は、max_lo値を0に設定します(このパラメータをジェネレータタグ内に入れます:2)。これは取得するたびにデータベースに行く必要があるためアルゴリズムが遅くなります新しいnext_hi値。

+0

DannyT、あなたの事件で何が起こっているかどうかを理解するのに役立ちますか? – Voislav

+0

申し訳ありませんが、ちょうどこの応答を見たことがあります。 – DannyT

関連する問題