hibernate的主键增长策略

来源:互联网 发布:windows不能切换到mac 编辑:程序博客网 时间:2024/05/16 02:07

什么是对象标识符OID(object id)

hibernate中的持久化对象对应数据库中的一张数据表,因此hibernate通过OID来区分不同的持久化对象。从表的角度看,OID对应表的主键。因此在使用hibernate时,建议每一个domain对象(javabean/pojo)都要有一个不包含业务逻辑的 主键属性,且尽量不要使用复合主键。


hibernate常见的8种标识符生成方法(还有其他的生成策略),其中包括7种标识符生成器和一种复合主键生成方式

①increment标识符生成器

由hibernate自动以递增方式生成标识符,每次增量为1(无法修改增量),用于long、short、int类型生成唯一标识,在集群下不要使用

优点:不依赖于低层数据库系统,适用于所有的数据库系统

缺点:适用于单进程环境下,在多线程环境下很可能生成相同主键值,且OID必须为数值类型,如long、short、int


②identity标识符生成器

由底层数据库生成标识符

前提条件:数据库支持自动增长字段类型,比如sql server,mysql,(oracle不支持identity),且OID必须为数值类型


③sequence标识符生成器

依赖于底层数据库系统的序列

前提条件:需要数据库支持序列机制,比如oracle,PostgreSQL,DB2等,(sql server,mysql不支持序列),且OID必须为数值类型


④native标识符生成器

native标识符生成器能根据底层数据库系统的类型,自动选择合适的标识符生成器,因此非常适用于跨数据库平台开发,他会由hibernate根据数据库适配器中的定义,自动采用identity、hilo、sequence的其中一种作为主键生成方式,但是OID必须为数值类型


⑤hilo标识符生成器

由hibernate按照一种high/low算法(高低位算法)生成标识符,从数据库中的特定表的字段中获取high值,因此需要额外的数据库表保存主键生成的历史状态,hilo生成方法不依赖于底层数据库,因此适用于每一种数据库,但OID必须是数值类型

配置文件:

<id name="id" type="java.lang.Integer" column="ID">

<generator class="hilo">

<param name="table">my_hi_value</param>
<param name="column">next_value</param>

</generator>

</id>

配置完往数据库插入数据时会先自动创建一张名为my_hi_value的表


⑥uuid标识符生成器

由hibernate基于128-bit唯一值产生算法,根据当前设备IP,时间,JVM启动时间,内部自增量等4个参数生成16进制数值作为主键,OID一般使用String类型


⑦assigned标识符生成器

表示由应用程序逻辑来负责生成主键标识符,OID类型没有限制


⑧映射复合主键

尽量避免使用这种主键,因为数据不稳定,开发效率低


⑨foreign

在one-to-one的关系中,由另一张表的主键来决定自身的主键/外键


关于使用哪种生成策略的简单原则:

※针对oracle,主键如果是数值类型建议使用sequence,如果是String类型建议使用uuid或assigned

※针对mysql,主键如果是数值类型建议使用increment或assigned,如果是String类型建议使用uuid或assigned

针对sql server,主键如果是数值类型建议使用identity/native/assigned,如果是String类型建议使用uuid或assigned

※如果是one-to-one又基于主键的,则使用foreign

原创粉丝点击