高低算法

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值