我的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 question和this question生成类似100000000000,10000000000001,100000000002,...,100000000100,10000001001,1000000102,...的ID。
相反,NHibernate正在生产ID 101000000000,10100000000001,10100000000002,...,101000000100,1010000100101,101000000102等额外1.如何生成这些ID以及如何让它不添加额外的1到id ?
答案 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等