Hibernate——对象标识符生成方法(主键增长策略)

Hibernate对象标识符(OID)

Hibernate中的持久化对象对应数据库中的一张数据表,因此区分不同的持久化对象,在Hibernate中是通过OID(Object ID,对象标识符)来完成的,从表的角度看,OID对应表的主键。从类的角度看,OID对应类的主键属性。

对象标识符生成方法

Hibernate中的主要对象标识生成策略很多,这里主要介绍9中标识符生成方法。其中包括7种标识符生成器和一种复合主键生成方式。

increment标识符生成器

由Hibernate自动以递增的方式生成标识符,每次增量为1.

优点:不依赖于底层数据库系统,适用于所有的数据库系统。
缺点:适用于单进程环境下,在多线程环境下很可能生成相同主键值,而且OID必须为数值类型,比如long,int,short类型。

配置方式为:

<id name="id" column="id">
    <generator class="increment"/>
</id>

identity标识符生成器

由底层数据库生成标识符。

前提条件是:数据库支持自动增长字段类型,比如(SQLServer, MySQL),而且OID必须为数值类型,比如long,int,short类型。

配置方式:

<id name="id" column="id" type="java.lang.Integer">
    <generator class="identity"/>
</id>

sequenct标识符生成器

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

前提条件是:需要数据库支持序列机制(如Oracle等),而且OID必须为数值类型,比如long,int,short类型。

配置方式:

<id name="id" type="java.lang.Long" column="ID">
    <generator class="sequence">
        <param name="sequence">my_seq</param><!--配置序列的名字-->
    </generator>
</id>

native标识符生成器

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

配置方式:

<id name="id" type="java.lang.Integer" column="ID">
    <generator class="native"/>
</id>

hilo标识符生成器

hilo标识符生成器由Hibernate按照一种high/low算法生成标识符,它从数据库中的特定表的字段中获取high值,因此需要额外的数据库表保存主键生成的历史状态,hilo生成方法不依赖于底层数据库,因此适用于每一种数据库,但是OID必须为数值类型,比如long,int,short等。

配置方式:

<id name="id" type="java.lang.Long" column="ID">
    <generator class="hilo">
        <param name="table">my_hi_value</param>
        <param name="column">next_value</param>
    </generator>
</id>

uuid标识符生成器

由Hibernate基于128位唯一值产生算法,根据当前设备IP,时间,JVM启动时间,内部自增量等4个参数生成16进制数值作为主键,一般而言,利用uuid方式生成的主键提供最好的数据插入性能和数据库平台适应性。OID一般是String类型.

配置方式:

<id name="id" type="java.lang.String" column="ID">
    <generator class="uuid"/>
</id>

assigned标识符生成器

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

配置方式:

<id name="id" type="java.lang.String" column="ID">
    <generator class="assigned"/>
</id>

foreign标识符生成器

用于one-to-one的关系中,根据另外一个表的主键自动生成的。详情可以查看【 Hibernate——关系映射之一对一】。

映射符合主键

尽量不要用符合主键,数据不稳定,效率也比较低。这里暂时省略。

选择生成器的原则

  1. 针对Oracle数据库而言,主键是数值型,建议使用sequence,主键是字符串的话,建议使用uuid或者assigned

  2. 针对MySQL数据库,主键是数值型的话,建议使用increment或者assigned,主键是字符串的话,建议使用uuid或者assigned

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值