`
wasw100
  • 浏览: 127164 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hibernate中使用hilo生成主键的原理

    博客分类:
  • java
阅读更多

hilo是hibernate中最长用的一种生成方式,hibernate给出了hilo 和 seqhilo两种生成器,他们的分别向下面一样配置

<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>

 

<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生成器。

如果你按照下面的方式配置

<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配置小一点,可以避免每次重启主键之间的间隔太大,造成主键值主键不连贯。

分享到:
评论
2 楼 wasw100 2009-09-20  
曾经de迷茫 写道
实际操作中,直接使用sequence或自增字段的时候更常见啊.

如果用sequence的话,数据库的移植性就差了呀,例如MySQL,mssql就不能用,而且hilo效率会高一点吧
1 楼 曾经de迷茫 2009-09-20  
实际操作中,直接使用sequence或自增字段的时候更常见啊.

相关推荐

    hibernate 主键生成策略

    - **描述**:使用“高/低”算法,通过在数据库中维护一个额外的表来生成主键,该表包含两个值:当前高值和剩余可用低值的数量。 - **应用场景**:适用于高性能的并发环境,因为它可以减少数据库的访问频率。 #### 7...

    hibernate主键生成策略

    - **应用场景**:适用于需要高效生成主键且支持JDBC 3特性的数据库。 ### 总结 不同的主键生成策略各有特点和适用场景,开发者应根据具体的应用需求和数据库特性来选择合适的策略。例如,如果应用程序需要高性能...

    hibernate原理与应用

    这里,`generator="native"`表示主键生成策略,可以根据不同的数据库系统选择不同的生成方式,如Identity(MySQL、MS SQL Server的自增)、Sequence(Oracle的序列)、Hilo等。 在实际应用中,Hibernate提供了多种...

    hibernate常见问题及处理.doc

    解决步骤包括检查文件的存放位置,确保它位于类路径下,并在配置文件中使用正确的`&lt;mapping&gt;`标签指向该文件。 3. `...

    Hibernate面试题-详尽解析

    - **实现原理**: 当应用程序使用`native`作为主键生成策略时,Hibernate会根据当前连接的数据库类型自动选择相应的生成器。 **1.2 identity方式** - **定义**: `identity`生成器依赖于底层数据库系统,通过设置...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     6.4.4 hilo标识符生成器  6.4.5 native标识符生成器  6.5 映射自然主键  6.5.1 映射单个自然主键  6.5.2 映射复合自然主键  6.6 小结  6.7 思考题 第7章 映射一对多关联关系  7.1 建立多对一的单向关联关系...

    孙卫琴hibernate sourcecode6

    此外,还讨论了Hibernate如何通过IdentifierGenerator策略生成唯一主键,如雪花算法和SequenceGenerator的实现,以及Identity与Table HiLo Generator的区别。 Chapter 22:查询优化与HQL 该章主要聚焦于Hibernate的...

    hibernate-note学习笔记

    - **sequence**: 使用数据库中的序列生成主键,适用于Oracle数据库。 - **identity**: 使用数据库的自增长字段生成主键,适用于SQL Server等数据库。 - **native**: 根据使用的底层数据库自动选择最合适的生成策略。...

    hibernate配置文件元素详解.txt

    - **`hilo`**: 使用高/低策略生成主键。 - **`uuid.hex`**: 生成128位的UUID。 - **`native`**: 根据不同数据库采用不同的策略。 - **`&lt;property&gt;`**: 定义普通属性的映射。 - **`name`**: 属性的Java属性名。 ...

    Hibernate学习笔记

    根据提供的文件信息,我们可以整理出一系列关于Hibernate的重要知识点。这些知识点包括了Hibernate的...通过上述知识点,我们可以全面了解Hibernate的工作原理及使用方法,这对于深入学习和实际应用都是非常有帮助的。

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     6.4.4 hilo标识符生成器  6.4.5 native标识符生成器  6.5 映射自然主键  6.5.1 映射单个自然主键  6.5.2 映射复合自然主键  6.6 小结  6.7 思考题 第7章 映射一对多关联关系  7.1 建立多对一的单向关联关系...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     6.4.4 hilo标识符生成器  6.4.5 native标识符生成器  6.5 映射自然主键  6.5.1 映射单个自然主键  6.5.2 映射复合自然主键  6.6 小结  6.7 思考题 第7章 映射一对多关联关系  7.1 建立多对一的单向关联关系...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     6.4.4 hilo标识符生成器  6.4.5 native标识符生成器  6.5 映射自然主键  6.5.1 映射单个自然主键  6.5.2 映射复合自然主键  6.6 小结  6.7 思考题 第7章 映射一对多关联关系  7.1 建立多对一的单向关联关系...

    identity:用于MySql数据库

    综上所述,不同的数据库系统提供了多种主键生成策略,包括MySQL的`auto_increment`、Oracle的`sequence`以及Hibernate框架中的`native`、`hilo`等。选择哪种策略取决于具体的应用需求和数据库特性。理解这些策略的...

    ssh 框架整合总结

    主键生成机制在Hibernate中至关重要,因为它确保了数据的唯一性。包括assigned(外部生成)、hilo、seqhilo、increment、identity、sequence、native、uuid.hex、uuid.string和foreign等多种方式,每种都有其适用...

Global site tag (gtag.js) - Google Analytics