Я изо всех сил пытаюсь понять, как работает генератор HiLo в NHibernate. Я прочитал объяснение здесь , которое немного прояснило ситуацию.
Насколько я понимаю, каждый SessionFactory извлекает высокое значение из базы данных. Это повышает производительность, потому что у нас есть доступ к идентификаторам без попадания в базу данных.
В объяснении по вышеприведенной ссылке также говорится:
Например, предположим, что у вас есть последовательность «high» с текущим значением 35, а число «low» находится в диапазоне 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 в книге действий, и до сих пор не рассказано, как это работает.
Спасибо
Бен