Generate hilo with sql
I'm using the hilo generator in NHibernate. I now need to manually import a load of records from an external source. What do I need to do to replicate what NH does with the primary keys?
We're using the following:
<class name="MyClass">
<id name="Id" column="Catalogue_Id">
<generator class="hilo" />
</id>
<!-- other stuff -->
</class>
which I believe uses a single one column tab开发者_JS百科le 'hibernate_unique_key' with the column 'next_hi' for all tables.
Additionally, I've been reading up on hilo and think I get the theory but I'm struggling to tie it back to the data that's being created.
I have one table with keys 1,2,3...
another has 65536, 65537, 65538... and another 98304, 98305, 98306... the value of next_hi in hibernate_unique_key is currently 6.Apologies if I'm just missing the obvious but can someone explain what's going on here?
You are using default configuration of the hilo generator where max_lo value is Int16.MaxValue (it is 32767). The value of next_hi you found in the database means how many "blocks" of the values are reserved by hilo generators used in NHibernate, where block means max_lo successive values. For your example the values you found in the database tables for keys are generated in the following way:
- First generator has reserved first block of the keys (from 0 to 32767) and incremented value of the next_hi to 1. This generator generated values from your first table: 1,2,3.. Zero is avoided by implementation so you did not get 0 key.
- Second generator has reserved second block of the keys (from 32768 to 65535) and incremented value of hext_hi to 2.
- Third generator has reserved third block of the keys (from 65536 to 98303) and incremented value of next_hi to 3. This generator generated values from your second table 65536, 65537....
- Fourth generator has reserved fourth block of the keys (from 98304 to 131071) and incremented value of the next_hi to 4. This generator generated values from your third table 98304, 98305...
Etc.. your sixth generator incremented next_hi value to 6 and it is what you have in the table. So situation you described is correct considering this generator and default configuration.
If you want to get successive values for all tables, you could set max_lo value to 0 (put this parameter within your generator tag: 2) which will slow down algorithm because it has to go each time to the database to get new next_hi value.
精彩评论