Hibernate标识符生成器

转载 2012年03月21日 20:45:09
 
1.assigned标识符生成器
  assigned标识符生成器指定由应用程序生成并维护持久化对象的标识符。在这种情况下,标识符生成器使用应用程序分配给对象的标识符值。一般情况下,assigned生成器使用一个自然键(包含对象的业务属性)做主键。
  assigned标识符生成器使用应用程序生成的标识符属性值,不涉及底层数据库实现细节,适合于各种数据库;持久化类的标识符可以采用任何Java支持的数据类型。但Hibernate不推荐使用assigned标识符生成器。因为assigned标识符生成器使用了包含业务信息的主键,系统扩展性不强。


2.increment标识符生成器
  increment标识符生成器以递增的方式由Hibernate自行生成标识符属性值,增量为1。其中持久化类的标识符可以采用short、int和long数据类型以及它们的包装类。
  increment适用于只有一个线程向数据库插入数据的情况,多个线程使用increment标识符生成器向同一数据库插入数据时,极易产生冲突,最终导致系统崩溃。虽然increment标识符生成器不依赖于数据库底层实现,适合于所有的数据库系统,但是只能局限于单个进程对同一数据库的操作,因而不推荐在生产环境中使用,尤其不推荐在集群中使用。


3.identify标识符生成器
  identify标识符生成器根据数据库底层机制,实现主键地自动增长。主键的增长方式在生成数据库表时进行定义。不同的数据库实现自动增长的方式有所不同,因而主键的定义方式也有所不同。其中持久化类的标识符可以采用short、int和long数据类型以及它们的包装类型。
  使用identify标识符生成器,需要依赖于底层数据库的主键生成机制。只要数据库支持自动增长的主键生成方式,就可以使用identify标识符生成器。Oracle不支持主键自动增长,identify标识符生成器不适合Oracle。


4.sequence标识符生成器
  sequence标识符生成器使用序列获取主键,根据序列值保证主键的唯一性。序列是一个数据库对象,不依赖于特定的表,Hibernate根据底层数据库的序列生成标识符。其中持久化类的标识符可以采用short、int和long数据类型以及它们的包装类型。
  使用sequence标识符生成器时,需要底层数据库具备生成序列的能力。只要数据库支持序列,就可以使用sequence标识符生成器。使用sequence标识符生成器时,需要注意一个问题:每次数据的插入,都会产生两条sql语句,第一条获取序列值,第二条才真正插入数据。MySQL和MS SQL Server不支持序列。


5.hilo标识符生成器
  hilo标识符生成器由Hibernate使用high/low算法来生成标识符,它从数据库的特定表的字段中获取high值。其中持久化类的标识符可以采用short、int和long数据类型以及它们的包装类型。
  由于high/low算法根据数据库的表由Hibernate负责生成主键值,不依赖于特定的数据库,所以hi/lo对象标识符生成器可以适用于所有的数据库。


6.uuid标识符生成器
  uuid标识符生成器使用一个128位的全局唯一标识符(Universally Unique Identifier,UUID)算法生成字符串类型的标识符。UUID包含本机的IP地址、本机JVM的信息,相对于同一时空中的所有机器都是唯一的。uuid标识符生成器由Hibernate维护并生成uuid值,不依赖于底层数据库的实现细节,因而可以适用于所有数据库。
  使用uuid标识符生成器需要注意以下的问题:由于UUID的值是完全随机的,因此在数据库中,不能确定记录的顺序。另外,uuid标识符生成器使用32位16进制字符串,需要占用更多的空间,索引的效率也比较低。


7.guid标识符生成器
  guid包含当前日期、时间、时钟序列和全局唯一的IEEE机器识别号等,在全局是唯一的。
  使用guid标识符生成器保存数据时,标识符生成器从数据库中获取guid作为对象标识符的值和记录的主键。使用guid需要底层数据库的支持。


8.native标识符生成器
  native标识符生成器本身不具备生成主键的能力,是为了扩展hibernate的跨平台支持能力而引入的特性。native标识符生成器根据底层数据库的支持能力自动从identify、sequence和hilo三者之中选择合适的标识符生成器。如果底层数据库支持标识字段的主键,如MySQL数据库,native标识符生成器选择使用identify标识符生成器;如果底层数据库支持序列方式生成主键,如Oracle数据库,native标识符生成器将选择使用sequence标识符生成器。使用时,只需要设置generator元素的class属性为native,就可以使Hibernate具备跨平台的支持能力。
  在支持序列的数据库中使用native标识符生成器时,如果Hibernate配置为启动时自动生成数据库模式,那么应用程序将自动生成序列hibernate_sequence,并在整个Hibernate应用中,共享序列hibernate_sequence。否则,需要手工创建序列,并在映射定义文件中指定序列的名称 。

常用数据库可使用的标识符生成器:
MySQL:identity、increment、hilo、native
MS SQL Server:identity、increment、hilo、native
Oracle:sequence、seqhilo、increment、hilo、native
跨平台开发:native

Hibernate中的8种标识符生成器

1.assigned标识符生成器   assigned标识符生成器指定由应用程序生成并维护持久化对象的标识符。在这种情况下,标识符生成器使用应用程序分配给对象的标识符值。一般情况下,assigned...

Hibernate内置标识符生成器

原文地址 CoderGO : http://leekai.me/?p=205引言Java默认情况是根据内存地址来区分不同的对象,关系数据库则是根据主键值区分不同的行。Hibernate使用对象标识符(...

Hibernate内置对象标识符(OID)生成器

1.increment标识符生成器: private

hibernate之标识符生成器用法

hibernate常用主键生成策略说明
  • yhl_jxy
  • yhl_jxy
  • 2016年02月16日 15:08
  • 518

Hibernate 之 标识符生成器/映射类型

下午用hibernate去改善一个项目,结果出现了好多关于映射类型的问题,在网上搜的好多答案也不尽人意,后来结合着hibernate文档以及孙卫琴老师的《hibernate逍遥记》终于解决了 hib...
  • ljfbest
  • ljfbest
  • 2012年04月12日 11:54
  • 916

GUI标识符自动生成器.rar

  • 2015年12月09日 10:34
  • 197KB
  • 下载

Hibernate学习笔记(二)【标识符及基本级联配置】

标识符 increment 用于代理主键.由Hibernate自增方式生成标识符,每次增量为1 identity 同上。由底层数据库生成标识符.前提是要数据库支持自增 sequence 同上。由...

hibernate一对多异常 ERROR: ORA-00904: "CITY0_"."AID": 标识符无效

今日遇到一个异常纠结很久,hibernate一对多查询问题,po类及

hibernate映射对象标识符

(一)、标示符的概念 Java按内存地址区分同一个类的不同对象,关系数据库用主键区分同一个表的不同记录,Hibernate使用OID(对象标识符)来建立内存中的对象和数据库中记录的对应关系。...
  • z_Dendy
  • z_Dendy
  • 2013年05月14日 22:29
  • 807

Hibernate标识符属性(主键)生成策略全析

数据库中的主键 在数据库表中能够唯一识别每一条记录的一个字段或者多个字段的组合,称之为主键(primary key).主键的作用将表中记录的数据和其他表中的数据进行关联. 自然主键和复合主键....
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate标识符生成器
举报原因:
原因补充:

(最多只允许输入30个字)