hibernate 主键生成策略

Hibernate的主键生成策略分两大类,一类是内置的主键策略,一类是自定义的主键策略。

常用内置主键策略

1) assigned

主键由应用程序负责生成,在save()之前必须使用主键的setter方法指定一个,至于这个值怎么生成,完全由应用程序自己决定。Hibernate不负责维护主键生成,与Hibernate和底层数据库都无关,可以跨数据库使用。

特点:跨数据库,与hibernate和底层数据库无关,但是需要考虑主键的唯一性问题

2) native

hibernate根据底层数据库的能力,自动生成相应的OID策略,若为mysql,则默认选择identify,oracle会选择sequence。

3) increment

由Hibernate在内存中生成主键,每次增量为1,不依赖于底层的数据库,因此所有的数据库都可以使用,但问题也随之而来,由于是Hibernate生成的,所以只能有一个Hibernate应用进程访问数据库,否则就会产生主键冲突,不能在集群情况下使用

插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法。

特点:(1)新增数据前先查询一遍,影响了性能;(2)主键的类型只能为数值型的int或者long;(3)并发操作时的冲突问题

4) identity

identity由底层数据库生成标识符。identity是由数据库自己生成的,但这个主键必须设置为自增长,使用identity的前提条件是底层数据库支持自动增长字段类型,如DB2、SQL Server、MySQL、Sybase和HypersonicSQL等,Oracle这类没有自增字段的则不支持。

特点:只能用在支持自动增长的字段数据库中使用,如MySQL。

5) sequence

采用数据库提供的sequence机制生成主键,需要数据库支持sequence。如oralce、DB、SAP DB、PostgerSQL、McKoi中的sequence。MySQL不支持sequence(可以使用identity)。

Hibernate生成主键时,查找sequence并赋给主键值,主键值由数据库生成,Hibernate不负责维护,使用时必须先创建一个sequence,如果不指定sequence名称,则使用Hibernate默认的sequence,名称为hibernate_sequence,前提要在数据库中创建该sequence。

特点:只能在支持序列的数据库中使用,如Oracle。

6) uuid

uuid:Universally UniqueIdentifier,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。Hibernate在保存对象时,生成一个UUID字符串作为主键,保证了唯一性,但其并无任何业务逻辑意义,只能作为主键,唯一缺点长度较大,32位的字符串,占用存储空间大。优点是,Hibernate在维护主键时,不用去数据库查询,从而提高效率,而且它是跨数据库的,以后切换数据库极其方便。

特点:uuid长度大,占用空间大,跨数据库,不用访问数据库就生成主键值,所以效率高且能保证唯一性,移植非常方便。

7) foreign

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

特点:使用较少,大多用在一对一关系中,具有一定的局限性,得考虑一对一表存储的先后关系。


自定义主键策略

Hibernate3.x提供的标识生成器扩展相关接口:org.hibernate.id.IdentifierGenerator和org.hibernate.id.Configurable。实现接口的方法就可很方便的完成自定义主键策略。使用方法如下

<id name="uid" type="java.lang.String">

    <columnname="uid" length="32" />

    <generatorclass="com.study.identifier.GeneralUid" />

</id>




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值