【吐血整理】Hibernate常用的主键生成策略的原理、优缺点、应用场合

  • Post author:
  • Post category:其他





// 此文由老猫烧须整理,其中加上本人的使用教程,如有误,欢迎指出
// 仅作学习以及备份使用,转载如带有本人整理资料请注明出处
// 欢迎大家留言交流

简介版:


increment:代理主键,适合于所有数据库,由hibernate维护主键自增,和底层数据库无关,但是不适合于2个或以上hibernate进程。【不推荐】


identity:代理主键,适合于Mysql或ms sql server等支持自增的dbms,主键值不由hibernate维护。


sequence:代理主键,适合于oracle等支持序列的dbms,主键值不由hibernate维护,由序列产生。


native:代理主键,根据底层数据库的具体特性选择适合的主键生成策略,如果是mysql或sqlserver,选择identity,如果是oracle,选择sequence。


hilo:代理主键,hibernate把特定表的字段作为hign值,生成主键值


uuid.hex:代理主键,hibernate采用uuid 128位算法生成基于字符串的主键值


assign:适合于应用程序维护的自然主键。





PS.代理主键是指与业务无关且能唯一标识数据库中记录,一般是数据库自动生成的,比如mysql可以使用auto_increment,Sql2000可以使用identity生成方式,oracle可以使用sequence生成方式 自然主键指业务相关,由用户指定,且能唯一标识数据库中的任意一条记录















//===================================== 分割线,详细版 =====================================



(1)increment


a)对主键值采取自动顺序增长的方式生成新的主键,值默认从1开始。


b)原理:在当前应用实例中维持一个变量,以保存当前最大值,之后每次需要生成主键值的时候将此值加1作为主键.

不依赖于底层的数据库,因此所有的数据库都可以使用


c)缺点:通过increment的生成主键的原理可推断,此种主键生成策略不适用于集群、同一时段大量用户并发访问的系统,

既当大量用户同一时间段同时进行插入操作的时候,可能存在取得相同的最大值然后再同时+1的情况,这个时候就会造成主键冲突

。因此,

如果同一数据库有多个实例访问,此方式必须避免使用。


小结:这个是由Hibernate在内存中生成主键,每次增量为1,不依赖于底层的数据库,



版权声明:本文为nthack5730原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。