2011-01-31 58 views
1

我在NHibernate中使用hilo生成器。我現在需要從外部源手動導入記錄負載。我需要做什麼來複制NH對主鍵的操作?用sql生成hilo

我們使用以下:

<class name="MyClass"> 
    <id name="Id" column="Catalogue_Id"> 
     <generator class="hilo" /> 
    </id> 
    <!-- other stuff --> 
</class> 

我相信使用與列「next_hi」的所有表一個一個列的表「是hibernate_unique_key」。

此外,我一直在讀hilo,並認爲我得到的理論,但我努力將其綁回到正在創建的數據。

我有鑰匙1,2,3一個表...
另一個有65536,65537,65538 ...
另有98304,98305,98306 ...
的是hibernate_unique_key next_hi的價值目前是6.

道歉,如果我只是想念明顯,但有人可以解釋這裏發生了什麼?

+0

更新:所以我現在意識到鍵是如何遞增的,因爲默認的max_lo是32k的東西。我想這是我需要能夠手動生成我自己的ID的信息,如下所示:grab next_hi,將其乘以32k,將next_hi更新爲+1,並使用我的計算ID向後 – DannyT 2011-01-31 13:17:47

回答

2

您正在使用hilo生成器的默認配置,其中max_lo值爲Int16.MaxValue(它是32767)。您在數據庫中找到的next_hi值意味着NHibernate中使用的hilo生成器保留了多少「塊」值,其中塊意味着max_lo連續值。對於示例你在數據庫表中以下列方式產生的密鑰中找到的值:

  1. 第一發生器已保留的鍵(0〜32767)的第一塊和遞增next_hi的值設置爲1。該生成器從第一個表中生成值:1,2,3 ..通過實現避免了零,因此您沒有得到0鍵。
  2. 第二發生器已保留的鍵(從32768至65535)的第二塊和遞增hext_hi的值爲2。
  3. 第三發生器已保留的鍵(從65536至98303)的第三塊和遞增的值next_hi到3.這個發生器從你的第二個表65536,65537產生值......
  4. 第四個發生器已經保留了第四個密鑰塊(從98304到131071)並且next_hi的值增加到4.這個發生器從你的第三個表98304,98305 ...

等等..你的第六個發生器遞增next_hi值爲6,這是你hav e在表中。所以你描述的情況是正確的,考慮到這個發生器和默認配置

如果你想獲得所有表的連續值,你可以設置max_lo值爲0(把這個參數放在你的generator標籤中:2),這會減慢算法,因爲它必須每次都去數據庫去獲得新的next_hi值。

+0

DannyT,做了答案幫助你理解你的情況是怎麼回事? – Voislav 2011-02-19 19:21:34