hibernate主键生成策略

常用的主键生成策略分析

基本使用方式:

 <id name="id" column="表主键字段名" type="java.lang.Integer">

        <generator class="设置主键生成策略类型"/>
 </id>



UUID.(hex):字段类型:String
a)原理UUID使用128位UUID算法生成主键,能够保证网络环境下的主键唯一性,也就能够保证在不同数据库及不同服务器下主键的唯一性。
所以使用于所有数据库。
b)特点:能够保证数据库中的主键唯一性,但是在生成的主键占用比较多的存贮空间
配置语法:
<id name="id" column="id">
  <generator class="UUID.hex" />
</id>


identity :根据数据库底层来
       a)根据底层数据库,来支持自动增长,不同的数据库用不同的主键增长方式。
       b)特点: 与底层数据库有关,要求数据库支持Identity,如MySQl中是auto_increment, SQL Server 中是Identity。
支持的数据库有MySql、SQL Server、DB2、Sybase和HypersonicSQL。
       c)好处:在建表的时候指定了id为自动增长,实际开发中就不需要自己定义插入数据库的主键值,系统会自动顺序递增一个值 。
Identity无需Hibernate和用户的干涉,使用较为方便,但由于依赖于数据库,所以不便于在不同的数据库之间移植程序。
数据库中的语法如下:
MySQL:create table t_user(id int auto_increment primary key, name varchar(20));
SQL Server:create table t_user(id int identity(1,1) primary key, name varchar(20));
配置语法:
<id name="id" column="id" type="long">
   <generator class="identity" />
</id>


assigned
       a)作用:用于手工分配主键生成器,一旦指定为这个了,Hibernate就不在自动为程序做主键生成器了。没有指定<generator>标签时,
       b)使用方法:在程序中session.save();之前,由程序员自己指定主键值为多少。
         例如:user.setId(1);这就是在程序中程序员手动为用户表指定主键值为1。
配置语法:
<id name="id" column="id" type="long">
   <generator class="assigned" />
</id>
native
       a)作用:根据数据库的类型,自动在sequence 、identity和,hilo进行切换。
       b)实现自动切换的依据:根据Hibernate配置文件中的方言来判断是Oracle还是Mysql、SqlServer,然后针对数据库的类型抉择 
sequence还是identity作为主键生成策略。
       c)用处:由于Hibernate会根据底层数据库采用不同的映射方式,因此灵活性高,便于程序移植,项目中如果用到多个数据库时,
可以使用这种方式。
配置语法:
<id name="id" column="id">
  <generator class="native" />
</id>
foreign
       只适用基于共享主键的一对一关联映射的时候使用。即一个对象的主键是参照的另一张表的主键生成的。
配置语法:
<id name="id" column="id">
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
<one-to-one name="user" class="domain.User" constrained="true" />
sequence
       a)sequence实际是就是一张单行单列的表。
       b)实现原理:调用数据库中底层存在的sequence生成主键,需要底层数据库的支持序列,因此他是依赖于数据库的。
       c)支持sequence的数据库有:Oracle 、DB2(MySQL/SQlServer不支持)、PostgreSql、SAPDb等
       数据库中的语法如下:
Oracle:create sequence seq_name increment by 1 start with 1;
需要主键值时可以调用seq_name.nextval或者seq_name.curval得到,数据库会帮助我们维护这个sequence序列,保证每
次取到的值唯一,如:
insert into tbl_name(id, name) values(seq_name.nextval, ‘Jimliu’);
配置语法:
<id name="id" column="id" type="long">
   <generator class="sequence">
      <param name="sequence">seq_name</param>
  </generator>
</id>


 对数据库的依赖性总结
    UUID,increment、Hilo、assigned:对数据库无依赖
    identity:依赖Mysql或sql server,主键值不由hibernate维护
    sequence:适合于oracle等支持序列的dbms,主键值不由hibernate维护,由序列产生。
    native:根据底层数据库的具体特性选择适合的主键生成策略,如果是mysql或sqlserver,选择identity,如果是oracle,选择sequence。
 
 
   关于主键生成策略的选择:
    一般来说推荐UUID,因为生成主键唯一,且对数据库无依赖,可移植性强。
    由于常用的数据库,如Oracle、DB2、SQLServer、MySql 等,都提供了易用的主键生成机制(Auto-Increase 字段或者Sequence)。我们可以在数据库提供的主键生成机制上,采用native,sequence或者identity的主键生成方式。
    不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳大量并发insert数据时可能会引起表之间的互锁。
    因此,对于并发Insert要求较高的系统,推荐采用uuid作为主键生成机制。
    总之,hibernate主键生成器选择,还要具体情况具体分析。一般而言,利用uuid方式生成主键将提供最好的性能和数据库平台适应性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值