hilo是hibernate中最长用的一种生成方式,hibernate给出了hilo 和 seqhilo两种生成器,他们的分别向下面一样配置
Hilo配置代码
<id name="id" type="int" column="id">
<generator class="hilo">
<param name="table">wasw100_hilo_tbl</param>
<param name="column">next_value</param>
<param name="max_lo">100</param>
</generator>
</id>

Seqhilo配置代码
<id name="id" type="int" column="id">
<generator class="seqhilo">
<param name="sequence">hi_value</param>
<param name="max_lo">100</param>
</generator>
</id>

seqhilo生成器需要数据库对sequence的支持,这里只讨论更通用的hilo生成器。

如果你按照下面的方式配置
Xml代码
<generator class="hilo">
<param name="max_lo">100</param>
</generator>

这样的缺省配置对应的数据库表是:hibernate_unique_key,对应的数据库字段是:next_hi。next_hi必须有一条记录否则会出现错误。

讨论前先说明几个简写的意义,以最上面那个配置为例:

hi: 高值--从数据库wasw100_hilo_tbl读取的next_value值

lo: 低值--hibe自动维护,从0到max_lo(看下面)

max_lo: 配置文件中<param name="max_lo">100</param>的值,这里是100

hibernate根据hilo生成器生成主键的过程:

1.读取并记录数据库的wasw100_hilo_tbl表中next_value字段的值,数据库中此字段值加1保存

2.hibernate取得lo值(0到max_lo-1循环,lo到max_lo时,执行步骤1,然后lo继续从0到max_lo循环)

取得hi值和lo值后,根据下面的公式计算主键值:

hi*(max_lo+1)+lo;

例如:
hi初始为2,max_lo为3
生成的值依次是:
读取hi为2,写到数据库为3
2*(3+1)+0=8
2*(3+1)+1=9
2*(3+1)+2=10
2*(3+1)+3=11
这有次读写表wasw100_hilo_tbl操作,hi变为3,数据库成为4
3*(3+1)+0=12
3*(3+1)+1=13

关闭数据库,下次打开时,读取hi值为4,数据库变为5
4*(3+1)+0=16

但是有一种特殊情况,就是hi是0的时候,那么第一个值不是0*(max_lo+1)+0=0
而是lo跳过0从1开始,直接是1、2、3……

那max_lo配置多大合适呢?

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

转载于:https://www.cnblogs.com/yangkai-cn/archive/2012/12/25/4017001.html

hibernate中的id特殊属性hilo剖解(多用于继承关系)相关推荐

  1. hibernate 中 Provided id of the wrong type for class 异常

    今天在工作中遇到了一个问题,在hibernate的使用过程中抛出了个异常: HTTP Status 500 - Provided id of the wrong type for class com. ...

  2. android中edittext属性,Android中EditText的inputType属性的详解

    xml的inputtype的值. Android:inputType="none" android:inputType="text" android:input ...

  3. JS中arguments对象的属性-callee详解

    callee则不是函数对象的属性,它是函数上下文中arguments对象的属性 function func() {alert(arguments.callee); } 它引用的是函数自身,在上面的代码 ...

  4. python的继承用法_python之继承中组合用法与菱形继承关系查找法

    1.什么是组合 组合就是一个类的对象具备某一属性,该属性的值是指向另外外一个类的对象 2.为什么用组合 组合也是用来解决类与类之间代码冗余问题 3.用法 class Course:           ...

  5. Hibernate 中配置属性详解(hibernate.properties)

    转自:https://blog.csdn.net/shudaqi2010/article/details/70324843 Hibernate能在各种不同环境下工作而设计的, 因此存在着大量的配置参数 ...

  6. hibernate 中id生成策略

    数据库的设计和操作中,我们通常会给表建立主键.  主键,可以分为自然主键和代理主键.  自然主键表示:采用具有业务逻辑含义的字段作为表的主键.比如在用户信息表中,采用用户的身份证号码作为主键.但是这样 ...

  7. Hibernate中inverse属性与cascade属性

    Hibernate集合映射中,经常会使用到"inverse"和"cascade"这两个属性.对于我这样,Hibernate接触不深和语文水平够烂的种种因素,发现 ...

  8. Hibernate继承(2)子类属性生成在自己的一张表中,父类的属性一张表

    Hibernate继承(2)子类属性生成在自己的一张表中,父类的属性一张表 <?xml version="1.0"?> <!DOCTYPE hibernate-m ...

  9. Hibernate映射普通属性、Hibernate中的各种类型

    <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibern ...

最新文章

  1. NOIP 2006 T2 金明的预算方案
  2. jquery对Select的操作
  3. MySQL调优(三):索引基本实现原理及索引优化,哈希索引 / 组合索引 / 簇族索引等
  4. k8s secret使用_Java Secret:使用枚举构建状态机
  5. d9900 修改ip 思科dcm_思科设备SSH登陆详细配置过程
  6. VMware设置及linux静态ip设置
  7. 不要等到离职,才明白这些道理
  8. SpringBoot重复配置数据库导致Access denied for user ‘root‘@‘localhost‘ (using password: YES)
  9. InveighZero:基于C#的数据欺骗和MitM工具
  10. 极路由1 1s 2 3 刷机 / 恢复 /强刷教程
  11. Mariadb 安装FederatedX引擎
  12. 安全管家安卓_网速管家安卓5.4版本全面上线
  13. 四则运算生成程序(基于控制台)
  14. html设置网格颜色,AI网格大小颜色怎么设置-设置AI网格大小颜色的方法 - 河东软件园...
  15. Swan Song Gamma阶段博客目录
  16. onenote的笔记本在windows10保存的路径
  17. lawson算法_案例研究:Lawson合并后整合架构的新方法
  18. 4.3.5 计算电费
  19. Windows Server 2008R2 安装.net 4.0
  20. 计算机u盘驱动坏了如何的修复,U盘损坏怎么恢复?学会这两招,快速恢复里面的文件...

热门文章

  1. 使用福禄克CFP单模光纤测试仪像专家一样设置参数!
  2. Win10软件:推荐两款Windows操作系统下的远程软件,值得收藏!
  3. 操作系统基础:存储管理知识笔记(一)
  4. 只有程序员才懂这些黑色幽默!
  5. 如何通俗地解释 C、C++、C#、Java、JavaScript、HTML、Python的用处
  6. yii2 session mysql_Yii框架 session 数据库存储操作方法示例
  7. python车牌识别逆光怎么办代码_这摄像头除了能逆光识别车牌,还会跟人打招呼?...
  8. 自媒体各大平台收益对比_哪些自媒体平台没有新手期,适合小白撸收益?
  9. STM32F1 GPIO工作原理初探
  10. jquery实现二级联动不与数据库交互