NHibernate seqhilo如何生成ID?

时间:2011-06-16 20:09:19

标签: c# oracle nhibernate nhibernate-mapping

我的Oracle数据库有一个从1,000,000,000开始的序列(PART_SEQ)。我的NHibernate映射使用这个序列使用seqhilo生成id。

  <id name="_persistenceId" column="Id" type="long" access="field" unsaved-value="0" >
     <generator class="seqhilo" >
        <param name="sequence">part_seq</param>
        <param name="max_lo">100</param>
     </generator>
  </id>

我希望根据this questionthis question生成类似100000000000,10000000000001,100000000002,...,100000000100,10000001001,1000000102,...的ID。

相反,NHibernate正在生产ID 101000000000,10100000000001,10100000000002,...,101000000100,1010000100101,101000000102等额外1.如何生成这些ID以及如何让它不添加额外的1到id ?

1 个答案:

答案 0 :(得分:1)

查看源here,算法的实现在将max_lo值乘以序列之前将其加1,以生成hi部分。然后将lo部分添加到此结果中以创建最终ID。

对于问题中的示例,它将以下列方式生成id:

//max_lo is set to 100 when the generator is initialized

if(lo > max_lo)
{
    lo = 1;
    sequence = GetNextSequenceNumber(...);  //Starts at 1 billion
    hi = sequence * (max_lo + 1);
}
returnVal = hi + lo++;

创建101000000001,101000000002,10100000000003等

相关问题