`
IISmichinaboy
  • 浏览: 6767 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate主键生成策略类型的使用说明[hibernate generator strategy]

阅读更多

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 作为主键生成
机制。

 

网摘补充:

 

1、如果主键字段为自增类型。
那么对应的.hbm.xml文件中的id字段的xml声明,
应该这么写:
<generator class="native" />
例如:
<id
column="user_id"
name="Id"
type="integer"
>
<generator class="native" />
</id>
其实这个native并非实际的类型,而是hiberante根据
当前使用的数据库,自动使用对应的类型。
例如:如果sqlserver,native就对应identity
见Hiberante参考:
native(本地)
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。

2、如果主键字段不设置为自增,但是是int型的。
可以使用increment,由hibernate产生主键。
<generator class="increment" />
不过这种方法,对于并发量大的应用,似乎最好不要采用。
见hiberante参考:
increment(递增)
用于为long, short或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。
在集群下不要使用。

3、如果使用uuid.hex产生的随机32位数最为主键。
那么数据库的id字段类型为char,长度为32
hbm.xml中写为: <generator class="uuid.hex" />
另外,uuid.string也是功能类似。
uuid.hex产生的是32位的16进制数字的字符串。
而uuid.string产生的是16个字符长的任意ASCII字符组成的字符串
见参考:
uuid.hex
用一个128-bit的UUID算法生成字符串类型的标识符。在一个网络中唯一(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。
uuid.string
使用同样的UUID算法。UUID被编码为一个16个字符长的任意ASCII字符组成的字符串。不能使用在PostgreSQL数据库中.

 

转自:http://javamao.iteye.com/blog/569322

分享到:
评论

相关推荐

    Hibernate中主键生成策略

    在Java的持久化框架Hibernate中,主键生成策略是一个至关重要的概念,它决定了数据库表中主键值如何自动生成。主键通常是表中唯一标识记录的一列,对于数据的完整性和一致性至关重要。以下是对Hibernate中主键生成...

    Hibernate主键策略-sequence

    Hibernate还提供了其他主键生成策略,如`increment`(适用于单线程环境),`identity`(数据库自增,如MySQL),`table`(通过独立的主键生成表)等,开发者应根据具体需求选择合适的策略。 6. **跨数据库兼容性**...

    Hibernate映射文件主键的生成

    在Java的持久化框架Hibernate中,主键的生成策略是一个重要的概念,它涉及到数据库表记录的唯一标识如何自动生成。本篇文章将详细讲解Hibernate映射文件中关于主键生成的各种策略及其配置,帮助开发者更好地理解和...

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

    在JPA中,单字段主键类型的生成策略主要包括以下四种: 1. **AUTO(自动自增生成)** - **概述**:`AUTO`是最常用的主键生成策略之一,也是JPA默认采用的方式。当使用该策略时,JPA会根据后端数据库的不同特性...

    Hibernate教程02_ID生成策略

    在Hibernate中,ID生成策略有多种类型,每种都有其特定的适用场景和优缺点。 1. ** Assigned **:由用户手动分配ID。这种策略适用于已存在全局唯一ID的情况,如UUID或序列号。 2. ** Auto Increment **:适用于...

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

    在这个场景中,“hibernate使用主键关联的一对一关系”指的是通过共享主键来实现两个实体类之间的这种一对一绑定。下面我们将深入探讨这一主题。 首先,我们需要理解一对一关系的概念。在数据库中,一对一关系意味...

    hibernate复合主键映射

    在这个例子中,我们添加了一个`Long`类型的`id`字段,并用`@GeneratedValue`和`@TableGenerator`注解来配置自动生成的策略。请注意,这仅适用于复合主键中包含自增部分的情况。 最后,确保在Hibernate配置文件(如`...

    Hibernate用UUID作为主键的Demo

    这里,`@GeneratedValue(generator = "uuid2")`指定了使用uuid2生成策略,而`@GenericGenerator(name = "uuid2", strategy = "uuid2")`定义了一个名为“uuid2”的生成器,其策略为“uuid2”,这是JPA中预定义的UUID...

    JAVA 的ID生成策略

    在跨不同数据库平台执行代码时,Hibernate会根据不同的数据库管理系统,选择合适的主键生成策略。例如,在SQL Server和Mysql中,使用自动增长字段生成策略,而在Oracle中,使用序列生成策略。 在 ID 生成策略中,...

    hibernate注解说明文档

    - `generator`:指定生成主键使用的生成器(可选)。 - **示例**: ```java @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long ...

    Hibernate全部注解

    - `native`:根据不同的数据库使用不同的主键生成策略。 - `uuid`:使用 UUID 生成主键。 - `hilo`:使用高/低位算法生成主键。 - `assigned`:主键由程序控制。 - **示例**: ```java @Entity public class ...

    Hibernate通过配置文件自动生成表

    在Java世界中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。本篇将详细讲解如何通过Hibernate配置文件自动生成数据库表,以及相关的知识...

    hibernate使用中与各种数据库字段类型对应类型训练

    在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库,而无需过多关注SQL语句的编写。本篇将主要围绕Hibernate在与各种数据库字段类型对应的Java类型进行...

    Hibernate注解用法总结

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

    hibernate注解配置

    - `GenerationType.AUTO`:根据当前使用的数据库自动选择合适的主键生成策略。 - `GenerationType.TABLE`:使用一个额外的表来保存主键序列。 - `GenerationType.IDENTITY`:利用数据库自身的自增特性来生成主键...

    Hibernate之配置使用案例hibernate001

    《Hibernate之配置使用案例hibernate001》 Hibernate,作为Java领域中的一款主流对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者使用面向对象的方式来处理数据库,而无需直接编写SQL语句。在本案例...

Global site tag (gtag.js) - Google Analytics