Hibernate各种主键生成策略与配置详解(二)

2014-11-24 18:37:32 · 作者: · 浏览: 2
acle中,使用select rawtohex(sys_guid()) from dual语句获得的为32位(不包含“-”) 特点:需要数据库支持查询uuid,生成时需要查询数据库,效率没有uuid高,推荐使用uuid


使用另外一个相关联的对象的主键作为该对象主键。主要用于一对一关系中。


该例使用domain.User的主键作为本类映射的主键。


特点:很少使用,大多用在一对一关系中。


使用触发器生成主键,主要用于早期的数据库主键生成机制,能用到的地方非常少。


注释方式与配置文件底层实现方式相同,只是配置的方式换成了注释方式


自动增长,适用于支持自增字段的数据库


根据底层数据库自动选择方式,需要底层数据库的设置


MySQL,会使用自增字段,需要将主键设置成auto_increment


使用表存储生成的主键,可以跨数据库。


每次需要主键值时,查询名为"hibernate_table"的表,查找主键列"gen_pk"值为"2"记录,得到这条记录的"gen_val"值,根据这个值,和allocationSize的值生成主键值。


使用序列存储主键值


1、为了保证对象标识符的唯一性与不可变性,应该让Hibernate来为主键赋值,而不是程序。


2、正常使用Hibernate维护主键,最好将主键的setter方法设置成private,从而避免人为或程序修改主键,而使用assigned方式,就不能用private,否则无法给主键赋值。


2Hibernate中唯一一种最简单通用的主键生成器就是uuid。虽然是个32位难读的长字符串,但是它没有跨数据库的问题,将来切换数据库极其简单方便,推荐使用!


3、自动增长字段类型与序列


4、关于hilo机制注意:


hilo算法生成的标志只能在一个数据库中保证唯一。


当用户为Hibernate自行提供连接,或者Hibernate通过JTA,从应用服务器的数据源获取数据库连接时,无法使用hilo,因为这不能保证hilo单独在新的数据库连接的事务中访问hi值表,这种情况,如果数据库支持序列,可以使用seqhilo


5、使用identitynativeGenerationType.AUTO等方式生成主键时,只要用到自增字段,数据库表的字段必须设置成自动增加的,否则出错。


6、还有一些方法未列出来,例如uuid.hexsequence-identity等,这些方法不是很常用,且已被其他方法代替,如uuid.hex,官方文档里建议不使用,而直接使用uuid方法。


7Hibernate的各版本主键生成策略配置有略微差别,但实现基本相同。如,有的版本默认sequence不指定序列名,则使用名为hibernate_sequence的序列,有的版本则必须指定序列名。


8、还可以自定义主键生成策略,这里暂时不讨论,只讨论官方自带生成策略。