Генерировать хило с помощью sql - PullRequest
1 голос
/ 31 января 2011

Я использую генератор hilo в NHibernate.Теперь мне нужно вручную импортировать загрузку записей из внешнего источника.Что мне нужно сделать, чтобы повторить то, что NH делает с первичными ключами?

Мы используем следующее:

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

, которое, как я считаю, использует таблицу из одного столбца 'hibernate_unique_key'со столбцом «next_hi» для всех таблиц.

Кроме того, я читаю на hilo и думаю, что у меня есть теория, но я изо всех сил пытаюсь связать ее с данными, которые создаются.

У меня одна таблица с ключами 1,2,3 ...
, другая имеет 65536, 65537, 65538 ...
, а другая 98304, 98305, 98306 ...
значение next_hi в hibernate_unique_key в настоящее время равно 6.

Извиняюсь, если я просто упускаю очевидное, но кто-то может объяснить, что здесь происходит?

1 Ответ

2 голосов
/ 15 февраля 2011

Вы используете конфигурацию по умолчанию генератора hilo, где значение max_lo равно Int16.MaxValue (это 32767). Значение next_hi, найденное вами в базе данных, означает, сколько «блоков» значений зарезервировано генераторами hilo, используемыми в NHibernate, где 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 ...

И т. Д. Ваш шестой генератор увеличил значение next_hi до 6, и это то, что у вас есть в таблице. Таким образом, описанная вами ситуация является правильной, учитывая этот генератор и конфигурацию по умолчанию.

Если вы хотите получить последовательные значения для всех таблиц, вы можете установить значение max_lo равным 0 (поместите этот параметр в тег генератора: 2), что замедлит алгоритм, потому что каждый раз он должен обращаться к базе данных, чтобы получить новые значение next_hi.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...