Hibernate主键生成策略

来源:互联网 发布:邓肯常规赛数据统计 编辑:程序博客网 时间:2024/04/20 03:01

自然主键具有业务意义的字段作为主键,例如学生表中用学号作为主键

代理主键:定义的、专门用来标记记录的ID,它除了用来标识记录外,不具有                      任何的业务意义

 

 

ID生成器名称

说明

assigned

应用程序自身对id赋值。当设置<generator class="assigned"/>时,应用程序自身需要负责主键id的赋值,一般应用在主键为自然主键时。例如XH为主键时,当添加一个学生信息时,就需要程序员自己设置学号的值,这时就需要应用该id生成器。

native

由数据库对id赋值。当设置<generator class="native"/>时,数据库负责主键id的赋值,最常见的是int型的自增型主键。例如,在SQL Server中建立表的id字段为identity,配置了该生成器,程序员就不用为该主键设置值,它会自动设置。

hilo

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

 

seqhilo

 

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

 

increment

 

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

 

identity

 

采用数据库提供的主键生成机制,如SQL ServerMySQL中的自增主键生成机制。

 

sequence

采用数据库提供的sequence机制生成主键,如Oracle sequence

uuid.hex

 

Hibernate基于128位唯一值产生算法,根据当前设备IP、时间、JVM启动时间、内部自增量等4个参数生成十六进制数值(编码后长度为32位的字符串表示)作为主键。即使是在多实例并发运行的情况下,这种算法在最大程度上保证了产生id的唯一性。当然,重复的概率在理论上依然存在,只是概率比较小。一般而言,利用uuid.hex方式生成主键将提供最好的数据插入性能和数据平台适应性。

 

uuid.string

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

 

foreign

 

使用外部表的字段作为主键。该主键一般应用在表与表之间的关系上,会在后面的表对应关系上进一步讲解。

 

select

Hibernate 3新引入的主键生成机制,主要针对遗留系统的改造工程。