Я изо всех сил пытаюсь разобраться, как работает генератор HiLo в NHibernate. Я прочитал объяснение здесь, что сделало вещи немного яснее.
Я понимаю, что каждый SessionFactory извлекает большое значение из базы данных. Это повышает производительность, потому что у нас есть доступ к идентификаторам без попадания в базу данных.
Объяснение из приведенной выше ссылки также гласит:
Например, предположим, что у вас есть "высокая" последовательность с текущим значением 35, а "низкий" номер находится в диапазоне 0-1023. Затем клиент может увеличить последовательность до 36 (для других клиентов, чтобы иметь возможность генерировать ключи при использовании 35) и знать, что ключи 35/0, 35/1, 35/2, 35/3... 35/1023 являются все доступные.
Как это работает в веб-приложении, так как у меня нет только одного SessionFactory и, следовательно, одного hi-значения. Означает ли это, что в отключенном приложении вы можете получить двойные идентификаторы в таблице сущностей?
В моих тестах я использовал следующие настройки:
<id name="Id" unsaved-value="0">
<generator class="hilo"/>
</id>
Я провел тест, чтобы сохранить 100 объектов. Идентификаторы в моей таблице перешли от 32768 - 32868. Следующее значение hi было увеличено до 2. Затем я снова проверил свой тест и идентификаторы находились в диапазоне 65536 - 65636.
Во-первых, зачем начинать с 32768, а не с 1, а во-вторых, почему прыжок с 32868 до 65536?
Теперь я знаю, что мои суррогатные ключи не должны иметь никакого значения, но мы используем их в нашем приложении. Почему я не могу просто увеличить их, как поле идентификации SQL Server.
Наконец, кто-нибудь даст мне объяснение того, как работает параметр max_lo? Является ли это максимальным количеством низких значений (идентификаторы объектов в моей голове), которые могут быть созданы против большого значения?
Это одна из тем в NHibernate, с которой я изо всех сил пытался найти документацию. Я прочитал весь NHibernate в книге действий, и он все еще не понимает, как это работает в деталях.
Спасибо Бен