2011-06-16 80 views
2

我的Oracle数据库有一个从1,000,000,000开始的序列(PART_SEQ)。我的NHibernate映射使用seqhilo使用这个序列进行id生成。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> 

我IDS希望像千亿,100000000001,100000000002生成,... 100000000100,100000000101,100000000102,...基于this questionthis question

取而代之的NHibernate产生像101000000000,101000000001,101000000002,...,101000000100,101000000101,10100000000100,1010000101,101000000102与一个额外的1.如何产生这些ID,我怎么能得到它不加1额外的ID?

+2

你为什么在乎额外的1? – 2011-06-16 20:11:41

+0

这并不是我一定在意1;它实际上帮助我在我的情况。我更担心的是它不符合我的预期。当我不知道从中期望什么时,我不喜欢使用某些东西。 – brainimus 2011-06-16 20:24:23

回答

1

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

对于这个问题会产生IDS以下方式的例子:

//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,101000000003等