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配置小一点,可以避免每次重启主键之间的间隔太大,造成主键值主键不连贯。
分享到:
- 2009-09-19 16:56
- 浏览 4158
- 评论(2)
- 论坛回复 / 浏览 (2 / 7550)
- 查看更多
相关推荐
- **描述**:使用“高/低”算法,通过在数据库中维护一个额外的表来生成主键,该表包含两个值:当前高值和剩余可用低值的数量。 - **应用场景**:适用于高性能的并发环境,因为它可以减少数据库的访问频率。 #### 7...
- **应用场景**:适用于需要高效生成主键且支持JDBC 3特性的数据库。 ### 总结 不同的主键生成策略各有特点和适用场景,开发者应根据具体的应用需求和数据库特性来选择合适的策略。例如,如果应用程序需要高性能...
这里,`generator="native"`表示主键生成策略,可以根据不同的数据库系统选择不同的生成方式,如Identity(MySQL、MS SQL Server的自增)、Sequence(Oracle的序列)、Hilo等。 在实际应用中,Hibernate提供了多种...
解决步骤包括检查文件的存放位置,确保它位于类路径下,并在配置文件中使用正确的`<mapping>`标签指向该文件。 3. `...
- **实现原理**: 当应用程序使用`native`作为主键生成策略时,Hibernate会根据当前连接的数据库类型自动选择相应的生成器。 **1.2 identity方式** - **定义**: `identity`生成器依赖于底层数据库系统,通过设置...
6.4.4 hilo标识符生成器 6.4.5 native标识符生成器 6.5 映射自然主键 6.5.1 映射单个自然主键 6.5.2 映射复合自然主键 6.6 小结 6.7 思考题 第7章 映射一对多关联关系 7.1 建立多对一的单向关联关系...
此外,还讨论了Hibernate如何通过IdentifierGenerator策略生成唯一主键,如雪花算法和SequenceGenerator的实现,以及Identity与Table HiLo Generator的区别。 Chapter 22:查询优化与HQL 该章主要聚焦于Hibernate的...
- **sequence**: 使用数据库中的序列生成主键,适用于Oracle数据库。 - **identity**: 使用数据库的自增长字段生成主键,适用于SQL Server等数据库。 - **native**: 根据使用的底层数据库自动选择最合适的生成策略。...
- **`hilo`**: 使用高/低策略生成主键。 - **`uuid.hex`**: 生成128位的UUID。 - **`native`**: 根据不同数据库采用不同的策略。 - **`<property>`**: 定义普通属性的映射。 - **`name`**: 属性的Java属性名。 ...
根据提供的文件信息,我们可以整理出一系列关于Hibernate的重要知识点。这些知识点包括了Hibernate的...通过上述知识点,我们可以全面了解Hibernate的工作原理及使用方法,这对于深入学习和实际应用都是非常有帮助的。
6.4.4 hilo标识符生成器 6.4.5 native标识符生成器 6.5 映射自然主键 6.5.1 映射单个自然主键 6.5.2 映射复合自然主键 6.6 小结 6.7 思考题 第7章 映射一对多关联关系 7.1 建立多对一的单向关联关系...
6.4.4 hilo标识符生成器 6.4.5 native标识符生成器 6.5 映射自然主键 6.5.1 映射单个自然主键 6.5.2 映射复合自然主键 6.6 小结 6.7 思考题 第7章 映射一对多关联关系 7.1 建立多对一的单向关联关系...
6.4.4 hilo标识符生成器 6.4.5 native标识符生成器 6.5 映射自然主键 6.5.1 映射单个自然主键 6.5.2 映射复合自然主键 6.6 小结 6.7 思考题 第7章 映射一对多关联关系 7.1 建立多对一的单向关联关系...
综上所述,不同的数据库系统提供了多种主键生成策略,包括MySQL的`auto_increment`、Oracle的`sequence`以及Hibernate框架中的`native`、`hilo`等。选择哪种策略取决于具体的应用需求和数据库特性。理解这些策略的...
主键生成机制在Hibernate中至关重要,因为它确保了数据的唯一性。包括assigned(外部生成)、hilo、seqhilo、increment、identity、sequence、native、uuid.hex、uuid.string和foreign等多种方式,每种都有其适用...