`
crazycat03
  • 浏览: 175841 次
  • 性别: Icon_minigender_2
  • 来自: 呼和浩特
社区版块
存档分类
最新评论

hibernate主键生成方式及配置

阅读更多

Key Generator主键产生器

<generator>元素用来设定标识生成器。Hibernate提供了标识符生成器接口: org.hibernate.id.IdentifierGenerator接口;并且提供了多种内置的实现。例如: org.hibernate.id.IdentityGenerator; org.hibernate.id.IncrementGenerator;它们的缩写名分别为:identityincrement。在设置<generator>子元素的class属性时,既可以提供完整的标识符生成器的类名,也可以给定缩写名

 

标识符生成器

        

increment  

    适用于代理主键。由Hibernate自动以递增的方式生成标识符,每次增加1
优点:由于它的机制不依赖于底层数据库系统,因此它适合于所有的数据库系统。
缺点:只适合有单个Hibernate应用进程访问同一个数据库,在集群环境下不推荐使用它。 另外,OID必须为long,int,short类型,如果为byte类型,则会有异常。

identity 

适用于代理主键。由底层数据库生成标识符。前提条件是底层数据库支持自动增长字段类型。(oracle数据库不能用它)

sequence

适用于代理主键。Hibernate根据底层数据库的序列来生成标识符。前提条件是底层数据库支持序列。(oracle数据库能用它)

hilo 

适用于代理主键。Hibernate根据high/low算法来生成标识符。Hibernate把特定表的字段作为"high".在默认情况下选用hibernate_unique_key表的next_hi字段。它的机制不依赖于底层数据库系统,因此它适合于所有的数据库系统。high/low算法生成的标识符只能在一个数据库中保证唯一。

native

适用于代理主键。根据底层数据库对自动生成标识符的支持能力,来选择identity sequence hilo很适合于跨平台开发,即同一个Hibernate应用需要连接多种数据库系统。

uuid.hex

适用于代理主键。Hibernate采用128位的UUID算法来生成标识符。UUID算法能够在网络环境中生成唯一的字符串标识符。这种标识符生成策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。

assigned

适用于自然主键。由Java应用程序负责生成标识符,为了能让Java应用程序设置OID不能把setID()方法声明为private类型,应该尽量避免使用自然主键。

 

 

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

 

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

 

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


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

 

identity
  采用数据库提供的主键生成机制。如DB2SQL ServerMySQL中的主键生成机制。

 

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

 

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


 


8)

 

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

 

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

 

foreign
  使用外部表的字段作为主键。
  一般而言,利用uuid.hex方式生成主键将提供最好的性能和数据库平台适应性。
  另外由于常用的数据库,如OracleDB2SQLServerMySql 等,都提供了易用的主键生成机制(Auto-Increase 字段或者Sequence)。我们可以在数据库提供的主键生成机制上,采用generator-class=native的主键生成方式。

 

  不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳,大量并发insert数据时可能会引起表之间的互锁。数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生了较大影响。因此,对于并发Insert要求较高的系统,推荐采用uuid.hex 作为主键生成机制。

 

increment:生成long, short或者int类型的主键,不能在cluster环境下使用。适用于所有数据库
  identity:生成long, short或者int类型的主键。适用于DB2, MySQL, MS SQL Server, Sybase and HypersonicSQL
  sequence :生成long, short或者int类型的主键。适用于DB2, PostgreSQL, Oracle, SAP DB, McKoi,Interbase.
  hilo:生成long, short或者int类型的主键。需要提供一个数据库的表来存放生成的主键信息。当采用应用服务器的JTA提供的数据库连接或者用户自定义的数据库连接的时候,不要使用这种主键生成方式。适用于所有数据库
  seqhilo:采用给定的数据库的sequence来生成long, short或者int类型的主键。适用于DB2, PostgreSQL, Oracle, SAP DB, McKoi,Interbase.
  uuid.hex:采用128位的算法来生成一个32位字符串。最通用的一种方式。适用于所有数据库
  uuid.string:同样采用128位的UUID算法。将生成的字符编码位16位。适用于除PostgreSQL.以外的数据库
  native:根据具体连接的数据库从identity, sequence或者hilo选择一种来生成主键。适用的数据库根据选择的生成方式确定。
  assigned: 交给应用自己给主键赋值。要注意的是赋值必须在调用save()方法之前完成。适用的数据库根据选择的生成方式确定。

 

 

 

 

参考:http://blog.csdn.net/jojoy_828/archive/2009/01/13/3768189.aspx

http://blog.csdn.net/zerolsy/archive/2008/09/10/2909174.aspx

分享到:
评论

相关推荐

    Hibernate各种主键生成策略与配置详解

    关于Hibernate的各种主键生成策略与配置详解

    Hibernate主键生成方式

    ### Hibernate主键生成方式详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象映射到数据库表及其字段,简化了持久化层的开发工作。在 Hibernate 中,主键生成策略是...

    hibernate主键生成策略

    ### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,它极大地简化了 Java 应用程序与数据库之间的交互过程。在使用 Hibernate 进行持久化操作时,经常需要处理实体类...

    Hibernate主键生成策略

    ### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象映射到数据库表中...合理地选择和配置主键生成策略能够有效提升应用程序的性能和稳定性。

    常用Hibernate主键生成策略

    ### 常用Hibernate主键生成策略详解 #### 一、引言 在数据库设计与操作过程中,主键是确保数据唯一性的关键要素之一。在实际应用中,开发者经常需要处理不同类型的数据库,并且需要应对各种不同的主键生成需求。...

    Hibernate中主键生成策略

    一种优化的主键生成方式,使用较小的整数范围(高位数)和数据库表中的行(低位数)来生成主键,减少对数据库的访问。使用`&lt;generator class="hilo"&gt;`。 理解并正确选择主键生成策略对于优化数据库性能、保证数据...

    hibernate映射主键生成策略native

    其中,主键生成策略是Hibernate配置中的一个重要部分,它决定了表中的主键值如何生成。本文将重点介绍在Oracle数据库环境下,使用Hibernate的“native”策略来生成主键的具体方法及注意事项。 #### 二、主键生成...

    hibernate主键生成策略详解

    ### hibernate主键生成策略详解 #### 一、assigned **assigned** 主键生成策略意味着主键的值是由外部程序负责生成的,并且在执行 `save()` 方法之前必须明确指定一个值。在这种策略下,Hibernate 不参与主键的...

    Hibernate主键生成策略.docx

    ### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一种流行的 Java 持久化框架,它简化了数据库操作,并提供了多种主键生成策略。主键是表中的一个或多个字段组合,用于唯一标识表中的每一条记录。...

    Hibernate映射文件主键的生成

    以上就是Hibernate主键生成的常见策略,每种策略都有其适用的场景。在实际开发中,应根据数据库类型和需求选择合适的主键生成策略,确保数据的一致性和完整性。理解并正确配置这些策略,将有助于提高程序的稳定性和...

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

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

    hibernate的主键生成策略

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

    hibernate中自动生成主键的办法

    在Hibernate中,可以通过`&lt;generator class="uuid.hex"/&gt;`来配置一个字段使用UUID.hex作为主键生成策略。这种方式特别适用于分布式系统,因为每个UUID都是独立生成且理论上不会重复。然而,由于UUID的长度较长,可能...

    hibernate使用主键关联的一对一关系

    在Java的持久化框架Hibernate中,一对一(OneToOne)关系是一种常见的对象关系映射(ORM)配置,用于表示两个实体类之间的一种唯一关联。在这个场景中,“hibernate使用主键关联的一对一关系”指的是通过共享主键来...

Global site tag (gtag.js) - Google Analytics