Hibernate主键生成方式 Key Generator

Hibernate主键生成方式 Key Generator

主键产生器

可选项说明:

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

时间: 2024-10-29 14:17:16

Hibernate主键生成方式 Key Generator的相关文章

Hibernate主键生成策略总结(这里面讲的很详细)

 Hibernate提供的主键生成策略,使我们可以在实体类的映射xml文件中设定关键字来告诉hibernate我们要使用的主键生成方式,然后hibernate会根据设定完成数据库的主键控制. 一.首先通过举例子来了解实体映射文件(*.hbm.xml)中对id生成策略配置格式     用户User的实体类User.java      [java] view plaincopyprint? package com.bjpowernode.hibernate;    import java.util.

常用Hibernate主键生成策略

今天学习到了关于Hibernate主键生成策略的问题,总结下,不足之处,请大家指出. Hibernate为优秀的持久层框架的代表.在传统的JDBC+JavaBean操作中,实体对象都由程序员自己去封装,然后返回.而在Hibernate中,采用对象关系映射『ORM』,大大简化了对数据库的操作. 在数据库的设计和操作中,我们通常会给表建立主键.主键,可以分为自然主键和代理主键. 自然主键表示:采用具有业务逻辑含义的字段作为表的主键.比如在用户信息表中,采用用户的身份证号码作为主键.但是这样一来,随着

hibernate主键生成策略-为什么我的程序只有native方式生效(注解)

问题描述 hibernate主键生成策略-为什么我的程序只有native方式生效(注解) 我想采用uuid主键策略,但是多次各种尝试都不成功.我是通过往数据库插入数据测试的.重点是使用native能正常插入数据,而使用uuid就不行,主要原因是整个程序也不报错,就是运行了,看起来就像是跳过执行插入语句一样,实际上是执行到了插入方法的,也没有堆栈信息什么的可参考.代码如下: @Id @GeneratedValue (generator = "paymentableGenerator" )

hibernate主键生成策略identity··为什么加入的第一个数据主键一直是0

问题描述 hibernate主键生成策略identity··为什么加入的第一个数据主键一直是0 从0开始没有1····· 解决方案 配置问题..............................

hibernate主键生成策略

问题描述 hibernate主键生成策略 最开始程序是oracle的 用的主键生成策略当然是序列 但以后可能需要兼容各种数据库所以把主键测试改为GenerationType.AUTO 改了之后再mysql中没任何问题 但在oracle中新增数据的时候一直都是ORA-00001: 违反唯一约束条件 (CREDITV2.SYS_C005464)这个错误.我猜测是主键重复了 请问怎么样的主键策略可以兼容多种数据库, 并兼容手动添加数据到表之后的主键, 兼容多种数据库数据互相导出导入

继承-hibernate主键注解问题

问题描述 hibernate主键注解问题 我想所有实体类继承一个BaseVO类,BaseVO类中包含公共信息如id,,问题来了,,主键注解怎么加???我加在BaseVO中,报错:No identifier specified for entity,缺少主键. BaseVO类: [code=java] public class BaseVO { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) protected Integer id;

oracel Alter table 给表增加主键 primary key

oracel alter table 给表增加主键 primary key sql> sql> create table emp (empno number(4) not null,   2                    ename varchar2(10),   3                    job varchar2(9),   4                    mgr number(4),   5                    hiredate date

Hibernate 主键生成策略问题

问题描述 在一对一的关系中,我希望两边都使用主键作为外键关联,使用xml配置可以实现,但是用了注解却不可以:请教各位大侠,这个东东搞了一天.注解配置:@EntitypublicclassPerson{@Idprivateintid;privateStringname;@OneToOne(cascade=CascadeType.ALL)@PrimaryKeyJoinColumnprivateCardcard;......}@EntitypublicclassCard{@Id@GeneratedVa

关于hibernate主键生成策略报错

问题描述 向数据库表中插入数据保存操作时报错,信息如下:org.hibernate.HibernateException:Thedatabasereturnednonativelygeneratedidentityvalueatorg.hibernate.id.IdentifierGeneratorFactory.getGeneratedIdentity(IdentifierGeneratorFactory.java:33)atorg.hibernate.persister.entity.Abs