用sql生成hilo

时间:2011-01-31 11:48:44

标签: .net sql-server nhibernate

我在NHibernate中使用hilo生成器。我现在需要从外部源手动导入一堆记录。我需要做些什么来复制NH对主键的作用?

我们正在使用以下内容:

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

我相信所有表都使用单个列表'hibernate_unique_key'和'next_hi'列。

此外,我一直在阅读希洛,并认为我得到了理论,但我正在努力将其与正在创建的数据联系起来。

我有一张带钥匙1,2,3 ...的桌子 另一个有65536,65537,65538 ...... 和另一个98304,98305,98306 ...
hibernate_unique_key中next_hi的值当前为6.

道歉,如果我只是错过了显而易见的事情,但有人可以解释这里发生了什么吗?

1 个答案:

答案 0 :(得分:2)

您正在使用hilo生成器的默认配置,其中max_lo值为Int16.MaxValue(它是32767)。您在数据库中找到的next_hi值表示NHibernate中使用的hilo生成器保留了多少“块”值,其中block表示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生成值...
  5. 等等。你的第六个生成器将next_hi值增加到6,这就是你在表中所拥有的。因此,考虑到此生成器和默认配置,您描述的情况是正确的。

    如果要获取所有表的连续值,可以将max_lo值设置为0(将此参数放在生成器标记中:2)这将减慢算法速度,因为它必须每次都去数据库以获得新的next_hi值。