您的位置:首页 > 数据库 > Oracle

Hibernate主键生成策略

2011-05-04 22:49 218 查看
自然主键:具有业务意义的字段作为主键,例如学生表中用学号作为主键
代理主键:定义的、专门用来标记记录的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 Server、MySQL中的自增主键生成机制。
 
sequence
采用数据库提供的sequence机制生成主键,如Oracle
sequence
uuid.hex
 
由Hibernate基于128位唯一值产生算法,根据当前设备IP、时间、JVM启动时间、内部自增量等4个参数生成十六进制数值(编码后长度为32位的字符串表示)作为主键。即使是在多实例并发运行的情况下,这种算法在最大程度上保证了产生id的唯一性。当然,重复的概率在理论上依然存在,只是概率比较小。一般而言,利用uuid.hex方式生成主键将提供最好的数据插入性能和数据平台适应性。
 
uuid.string
与uuid.hex类似,只是对生成的主键进行编码(长度为16位)。在某些数据库中可能出现问题。
 
foreign
 
使用外部表的字段作为主键。该主键一般应用在表与表之间的关系上,会在后面的表对应关系上进一步讲解。
 
select
Hibernate 3新引入的主键生成机制,主要针对遗留系统的改造工程。
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息