zoukankan      html  css  js  c++  java
  • Hibernate框架 hilo 方式配置MySQL 数据库的主键自增

    hilo(高低位方式high low)是hibernate中最常用的一种生成方式,需要一张额外的表保存hi的值。保存hi值的表至少有一条记录(只与第一条记录有关),否则会出现错误。可以跨数据库。

     创建表 & 字段,赋值:

    ## Hibernate的Hilo主键 
    create table hibernate_hilo(next_hi integer not null);
    insert into hibernate_hilo(next_hi) values(1);

    hibernate 配置文件 : XXX.hbm.xml 的主键配置

            <id name="rowId" column="ROW_ID" type="java.lang.Long">
                <generator class="hilo">
                   <param name="table">hibernate_hilo</param>
                   <param name="column">next_hi</param>
                   <param name="max_lo">100000000</param>
               </generator>
            </id>    

      <param name="table">hibernate_hilo</param>   --  指定保存hi值的表名

      <param name="column">next_hi</param>      --  指定保存hi值的列名

      <param name="max_lo">100</param>        --  指定低位的最大值

    也可以省略table和column配置,其默认的表为hibernate_unique_key,列为next_hi

    <id name="id" column="id">

    <generator class="hilo">

    <param name="max_lo">100</param>

    </generator>

    </id>

    hilo生成器生成主键的过程(以hibernate_unique_key表,next_hi列为例):

    1. 获得hi值:读取并记录数据库的hibernate_unique_key表中next_hi字段的值,数据库中此字段值加1保存。

    2. 获得lo值:从0到max_lo循环取值,差值为1,当值为max_lo值时,重新获取hi值,然后lo值继续从0到max_lo循环。

    3. 根据公式 hi * (max_lo + 1) + lo计算生成主键值。

    注意:当hi值是0的时候,那么第一个值不是0*(max_lo+1)+0=0,而是lo跳过0从1开始,直接是1、2、3……

    那max_lo配置多大合适呢?

    这要根据具体情况而定,如果系统一般不重启,而且需要用此表建立大量的主键,可以吧max_lo配置大一点,这样可以减少读取数据表的次数,提高效率;反之,如果服务器经常重启,可以吧max_lo配置小一点,可以避免每次重启主键之间的间隔太大,造成主键值主键不连贯。

    不用担心重启之后又重新开始计数,如图:

  • 相关阅读:
    【PAT甲级】1014 Waiting in Line (30 分)(队列维护)
    【PAT甲级】1013 Battle Over Cities (25 分)(并查集,简单联通图)
    获取当前时间
    设备版本,设备号,APP版本,APP名称获取
    获取设备号
    Button的图像位置设置
    UIButton设置imgae图片自适应button的大小且不变形
    手势图片:拖拽捏合旋转放大
    Unable to add App ID because the '10' App ID limit in '7' days has been exceeded.
    iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控
  • 原文地址:https://www.cnblogs.com/linnuo/p/7085688.html
Copyright © 2011-2022 走看看