1.hilo 和 seqhilo生成器给出了两种hi/lo算法的实现。
配置方式如下:
①hilo生成器
<id name="id" type="id" column="id">
<generator class="hilo">
<paramname="table">hibernate_unique_key</param>
<paramname="column">next_value</param>
<paramname="max_lo">100</param>
</generator>
</id>
②seqhilo生成器
<id name="id" type="long" column="cat_id">
<generator class="seqhilo">
<paramname="sequence">hi_value</param>
<paramname="max_lo">100</param>
</generator>
</id>
使用seqhilo生成器需要sequence的支持,下面我们只讨论更通用的hilo生成器。
2.hilo生成器默认请况下使用的表是hibernate_unique_key,默认字段叫作next_hi。
next_hi必须有一条记录否则会出现错误。
3.hi/lo算法中的几个基本概念:
①hi:高值——从数据库取得的那个值
②lo:低值——hibernate自动维护,取值1到max_low
③max_low:映射文件中配置的那个值
4.那hibernate怎样生成主键呢?
①从数据库中取得hi值,数据库的next_hi值加1
②hibernate取得lo值(0到max_lo-1循环,lo到max_lo时,执行步骤①得到+1后的next_hi值,然后lo继续从0到max_lo-1循环)
③根据下面的公式计算主键值:
hi*(max_lo+1)+lo;
5.例如hi初始为2,max_lo为3,按如下方式生成的主键:
①读取hibernate_unique_key表的next_hi列作为hi的值,现在是2,更新next_hi值为3,为下一次做准备。
2*(3+1)+0=8
2*(3+1)+1=9
2*(3+1)+2=10
2*(3+1)+3=11
②读取hibernate_unique_key表的next_hi列作为hi的值,现在是3。然后更新next_hi列的值为4,为下一次做准备。
3*(3+1)+0=12
3*(3+1)+1=13
③再下一次计算时,读取next_hi列作为hi值为4,hibernate_unique_key表的next_hi列的值变为5
4*(3+1)+0=16
④但是有一种特殊情况,就是hi是0的时候,那么第一个值不是0*(max_lo+1)+0=0而是跳过0,直接就是1