Как NHibernate Seqhilo генерирует идентификаторы? - PullRequest
2 голосов
/ 17 июня 2011

Моя база данных Oracle имеет последовательность (PART_SEQ), начинающуюся с 1 000 000 000. Мое сопоставление NHibernate использует эту последовательность для генерации идентификатора с использованием seqhilo.

  <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>

Я ожидаю, что будут сгенерированы идентификаторы, например, 100000000000, 100000000001, 100000000002, ..., 100000000100, 100000000101, 100000000102, ... на основе этого вопроса и этого вопроса .

Вместо этого NHibernate создает идентификаторы, такие как 101000000000, 101000000001, 101000000002, ..., 101000000100, 101000000101, 101000000102, 101000000102, с дополнительным 1. Как он генерирует эти идентификаторы и как я могу получить его, чтобы не добавлять дополнительный 1 к идентификатору

1 Ответ

1 голос
/ 21 июня 2011

Глядя на источник здесь , реализация алгоритма добавляет 1 к значению max_lo, а затем умножает его на последовательность для генерации части hi. Затем к этому результату добавляется часть lo, чтобы создать окончательный идентификатор.

Для примера в вопросе он будет генерировать идентификаторы следующим образом:

//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 и т. Д.

...