`
convertto
  • 浏览: 125013 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

hibernate 主键生成策略说明

阅读更多

经常使用hibernate来自动生成主键,在业务处理中,用得最多的就是自动生成UUID作为主键,但不具备业务主键,这样可以非常准确的保证主键的唯一性,但一个很大的缺点就是hibernate的关联,非主键关联处理起来很烦心,特别上次处理非主键一对一,烦心到死。还有一个用的比较多的生成算法就是Assigned ,如果主键由自己在程序中生成的话一般都是用这个主键。
在网上浏览了一些关于hibernate主键生成算法的说明,摘录如下

主键产生器的可选项说明:
1) Assigned
     主键由外部程序负责生成,无需Hibernate参与。

2) hilo
     通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。

3) seqhilo
     与hilo 类似,通过hi/lo 算法实现的主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。

4) increment
     主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。
  这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例访问,此方式必须避免使用。

5) identity
      采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL中的主键生成机制。

6) sequence
      采用数据库提供的sequence 机制生成主键。如Oralce 中的Sequence。

7) native
      由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。

8) uuid.hex
      由Hibernate基于128 位唯一值产生算法生成16 进制数值(编码后以长度32 的字符串表示)作为主键。

9) uuid.string
      与uuid.hex 类似,只是生成的主键未进行编码(长度16)。在某些数据库中可能出现问题(如PostgreSQL)。

10) foreign
      使用外部表的字段作为主键。

     一般而言,利用uuid.hex式生成主键将提供最好的性能和数据库平台适应性。
     另外由于常用的数据库,如Oracle、DB2、SQLServer、MySql 等,都提供了易用的主键生成机制(Auto-Increase 字段或者Sequence)。我们可以在数据库提供的主键生成机制上,采用generator-class=native的主键生成方式。不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳,大量并发insert数据时可能会引起表之间的互锁。
     数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生了较大影响。      
     因此,对于并发Insert要求较高的系统,推荐采用uuid.hex 作为主键生成机制。
     如果需要采用定制的主键产生算法,则在此处配置主键生成器,主键生成器必须实现net.sf.hibernate.id.IdentifierGenerator 接口。

分享到:
评论

相关推荐

    Hibernate主键生成方式

    以下是关于Hibernate主键生成方式的详细说明: 1. **Identity方式**:`<generator class="identity"/>` 这种方式依赖于数据库自身的自动增长机制。例如,在MySQL中,它可以与`AUTO_INCREMENT`属性配合使用。当...

    hibernate的主键生成策略

    以下是对Hibernate主键生成策略的详细说明: 1. **assigned**: 这种策略要求用户在调用`save()`方法之前手动设置主键值。Hibernate不参与主键的生成,这意味着主键生成完全由应用控制,可以与数据库无关。这种...

    JPA学习笔记-EJB-03JPA主键生成策略总结

    ### JPA主键生成策略详解 #### 一、概述 持久化对象的主键生成机制在JPA(Java Persistence API)中占据着重要的位置。它不仅关乎数据的唯一标识符如何确定,还与数据的存储效率及应用逻辑紧密相关。JPA通过`@...

    Hibernate主键类型说明和配置手册.doc

    以下是对Hibernate主键类型及其配置的详细说明: 1. **uuid.hex**: 这种生成器使用128位算法生成一个32位的字符串。由于其通用性,它适用于所有类型的数据库。在`.hbm.xml`映射文件中,你可以这样配置: ```xml ...

    hibernate注解说明文档

    - **功能**:声明一个Hibernate主键生成策略,支持多种策略。 - **属性**: - `name`:生成器名称。 - `strategy`:具体生成策略。 - `parameters`:获取具体的生成器所用到的参数。 - **示例**: ```java @...

    hibernate说明文档

    - **标识符**:配置实体的主键生成策略。 - **乐观锁定属性**:可选配置,用于实现并发控制。 - **属性**:定义实体类中的字段与数据库列之间的映射关系。 - **嵌入式对象**:将一个对象作为一个整体映射到另一...

    Hibernate 多数据库支持解决方案

    - Hibernate提供了多种主键生成策略,如`Identity`, `Sequence`, `Table`, `Auto`等。对于数值型主键,应根据目标数据库的特性选择合适的生成策略。例如,Oracle中常用`Sequence`,而MySQL中可能使用`Identity`或...

    Hibernate 注解说明文档

    2. **@GeneratedValue**: 控制主键生成策略,包括IDENTITY(自增)、SEQUENCE(序列)、TABLE(通过表生成)等。 三、属性映射 1. **@Column**: 映射字段到数据库列,可以指定列名、长度、是否可为空等属性。 ```...

    hibernate3中文官方文档

    映射文件包含了实体类的属性与数据库字段的对应、主键生成策略、关联关系等信息。 四、HQL(Hibernate 查询语言) HQL 是 Hibernate 自定义的一种面向对象的查询语言,类似于 SQL,但更加面向对象。它可以方便地...

    Hibernate说明

    1. 映射文件(hbm.xml):定义对象与数据库表的映射关系,包括字段对应、主键生成策略等。 2. 注解映射:使用Java注解在类和属性上,简化XML配置,使得代码更简洁。 四、实体(Entity) 实体是ORM中的关键概念,...

    常用 Hibernate 映射配置说明.doc

    `Generator-Class`子节点指定主键生成策略,常见的有`increment`(适用于自增主键)、`identity`(依赖数据库的自动增长功能)、`sequence`(使用序列生成主键)、`uuid.hex`或`uuid.string`(生成UUID)。...

    Hibernate注解用法总结

    - `@GeneratedValue`: 提供了多种主键生成策略,如`AUTO`(默认,根据数据库自动选择)、`IDENTITY`(基于数据库的Identity字段)、`SEQUENCE`(使用数据库序列)和`TABLE`(使用特定表来生成主键)。 - `@...

    hibernate黑马全视频重点记录

    9. **主键生成策略**: Hibernate提供了多种主键生成策略,如手动分配(`assigned`)、自增(`identity`)、序列(`sequence`)、高低位算法(`hilo`)、数据库自选(`native`)和UUID生成器(`uuid`)。 10. **对象状态**: ...

    演示怎样在Hibernate中使用复合主键

    如果使用Hibernate开发legacy的数据库应用,对于数据库表中有使用字符串作为主键或者使用复合主键情况,那么对于这些情况的影射档是比较麻烦的。该示例应用演示了两张表ITEM和CATEGORY_ITEM表有主外键关系,并且ITEM...

    Hibernate 详细带大量说明实例源码 精典的ORM讲解!

    - Entity类的注解:@Entity表示数据库中的一个表,@Table指定对应的表名,@Id表示主键,@GeneratedValue定义主键生成策略。 3. **实体类与数据库表的映射**: - 使用注解或XML文件定义实体类与数据库表的字段对应...

    hibernate annotation spring 中文参考文档

    Hibernate注解提供了如@Entity、@Table、@Id、@GeneratedValue等,它们分别用于定义实体类、指定表名、标识主键和主键生成策略。 Spring Framework是一个全面的后端开发解决方案,涵盖了依赖注入、AOP(面向切面...

    Hibernate学习笔记整理

    * Native:Hibernate 会根据数据库的不同,选择合适的主键的生成策略 Sequence * 是 oracle 内部特有的内容,相当于 uuid,所以是字符串类型对象 对象的状态 * 临时状态 * 持久化状态 * 脱管状态 案例 1. 说明...

Global site tag (gtag.js) - Google Analytics