hibernate主键自动生成

摘要:
主键应尽可能使用可以为空值的类型。id name=“attribute name”column=“database field name”type=“name identify Hibernate type”未保存值=“null|any|none|undefined|id_value”access=“field|property | ClassName”>

Entity类中,主键尽量使用可以为null值的类型,比如Integer,Long,String等,不要用int,long等。因为如果主键为null,则表示该实体类还没有保存到数据库,是一个临时状态(Transient),而int,long不能设置为null,不具备该功能。
<!--以上抄书,待研究论证-->

Java代码 复制代码 收藏代码hibernate主键自动生成第3张
  1. <id  name="属性名"column="数据库字段名" type="标识Hibernate类型的名字"    
  2.      unsaved-value="null|any|none|undefined|id_value"  
  3.      access="field|property|ClassName">                       
  4.            
  5.      <generator class="assigned|increment|identity|sequence|hilo|seqhilo|native|uuid|guid|select|foreign"/>   
  6. </id>  
<id  name="属性名"column="数据库字段名" type="标识Hibernate类型的名字" 
     unsaved-value="null|any|none|undefined|id_value"
     access="field|property|ClassName">                    
        
     <generator  />
</id>


如果 name属性不存在,会认为这个类没有标识属性
unsaved-value 参考http://blog.csdn.net/chunkyo/article/details/660050
access(可选 - 默认为property): Hibernate用来访问属性值的策略。 (网上查不到什么资料)

generator
1、assigned:
   在调用session.save()之前,必须手动setId(主键值),否则出错。
   <generator>没有指定时的默认生成策略。
2、increment:自增长,为long, short或者int类型生成主键
   自动增长,由hibernate维护,适用于所有的数据库,每次插入数据前先查询最大id(select max(id) from xxx),即使id已经设好值,无视。
   缺点:不适合多进程并发更新数据库,适合单一进程访问数据库。不能用于群集环境。
3、identity:自增长
    与increment不同的是:
    a)identity不是由hibernate控制,而是由数据库控制自增长,所插入数据前不会查询最大id。
    b)以Mysql为例,如果主键字段没有开启auto_increment,会抛异常"Field 'id' doesn't have a default value"。
    c)increment的insert语句包括id,identity的insert语句没有id字段。
    c)假设有五条数据,id分别为1、2、3、4,删除(3、4)后,用increment增加数据id为3,用identity增加数据id为5。
    不同的数据库有不同的自增长方式。如MySql是auto_increment,SQL Server 中是Identity。支持的数据库:MySql、SQL Server、DB2、Sybase和HypersonicSQL。
    优点: 不需要Hibernate和用户的干涉,使用较为方便。
    缺点:但不便于在不同的数据库之间移植程序。
4、sequence:自增长
    需要底层数据库支持Sequence方式。
    实现了Sequence的数据库:Oracle、DB2、PostgreSQL。
    没有实现Sequence的数据库:  MySQL、SQL Server、Sybase。
    如果在MySql中使用该方式,hibernate会根据Dialect判断报错。
5、hilo:hi/low(高低位)算法,高低位算法使用一个高位值和一个低位值,然后把算法得到的两个值拼接起来作为数据库中的唯一主键。Hilo方式需要额外的数据库表和字段提供高位值来源。默认请况下使用的表是hibernate_unique_key,默认字段叫作next_hi。next_hi必须有一条记录否则会出现错误。

Java代码 复制代码 收藏代码hibernate主键自动生成第3张
  1. <generator class="hilo" >   
  2.              <param name="table">hi_value</param>   
  3.              <param name="column">next_value</param>   
  4.              <param name="max_lo">100</param>   
  5. </generator>  
<generator   >
             <param name="table">hi_value</param>
             <param name="column">next_value</param>
             <param name="max_lo">100</param>
</generator>


    hibernate根据hilo生成器生成主键的过程:
     (1)读取并记录数据库的hi_value表中next_value字段的值,数据库中此字段值加1保存
     (2)hibernate取得lo值(0到max_lo-1循环,lo到max_lo时,执行步骤1,然后lo继续从0到max_lo循环)
     (3)取得hi值和lo值后,根据下面的公式计算主键值:hi*(max_lo+1)+lo;
     过程参考:http://hi.baidu.com/sai5d/blog/item/88e5f4db09e90277d0164e30.html
    个人感觉没有自增长好,不仅多维护一个表,每次插入数据都要进行查和修改next_value的值。
6、seqhilo基于sequence的hilo算法。
7、native:
   Native主键生成方式会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式
  特点:根据不同的底层数据库采用不同的主键生成方式。由于Hibernate会根据底层数据库采用不同的映射方式,因此便于程序移植,项目中如果用到多个数据库时,可以使用这种方式。
     疑问:什么时候选择Hilo?
7、uuid:
     id必须是String类型。
   使用128位UUID算法生成主键,能够保证网络环境下的主键唯一性,也就能够保证在不同数据库及不同服务器下主键的唯一性。
    特点:能够保证数据库中的主键唯一性,生成的主键占用比较多的存贮空间。
8、guid
      使用了一种特殊算法,保证生成主键的唯一性,支持SQL Server和MySQL。
      MySql中,先执行select uuid()。 uuid()是MySql自带的函数,取得uuid值后再生成主键。
9、select:使用数据库触发器赋值  (待研究)
10、foreign:使用外键赋值,在一对一实体关系时,可以保证关系双方的id保持一致。(待研究)

免责声明:文章转载自《hibernate主键自动生成》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇RabbitMQ 工作队列如何查看Python内置模块的实现代码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

AndroidManifest.xml文件详解(meta-data)

http://blog.csdn.net/think_soft/article/details/7567189 语法(SYNTAX): <meta-dataandroid:name="string"           android:resource="resource specification"           android:value...

面试官:说一下Redis和MongoDB的区别?

项目中用的是MongoDB,但是为什么用其实当时选型的时候也没有太多考虑,只是认为数据量比较大,所以采用MongoDB。 最近又想起为什么用MongoDB,就查阅一下,汇总汇总: 之前也用过redis,当时是用来存储一些热数据,量也不大,但是操作很频繁。现在项目中用的是MongoDB,目前是百万级的数据,将来会有千万级、亿级。 就Redis和MongoD...

Oracle系统表大全(转)

下面全面是对Oracle系统表的一些介绍: 数据字典dict总是属于Oracle用户sys的。   1、用户:    select username from dba_users;   改口令    alter user spgroup identified by spgtest;   2、表空间:    select * from dba_data_fi...

asp.net core系列 31 EF管理数据库架构--必备知识 反向工程

一.   反向工程   反向工程是基于数据库架构,生成的实体类和DbContext类代码的过程,对于Visual Studio开发,建议使用PMC。对于其他开发环境,请选择.NET Core CLI工具(跨平台)。     (1) 在程序包管理器控制台(PMC)工具中使用命令Scaffold-DbContext 来进行反向工程。     (2) 在.NET...

从微信授权到JWT认证——玩转token之路

一、写在微信前 是前段时间还是上几年来着,我记不太清了,只记得那个时候的我手机流量每个月是150MB,当然不是这个数字问题,而是由该数字引发的周围人对本人的各种调侃,使大家惊讶的是一个月150MB流量竟然用不完,而使我不解的是他们竟然接受不了用不完这个事实。那个时候的我,对流量的认知,更多的是手机上,直到后来参加工作,才开始广泛起来。 流量这个东西,很神奇...

Oracle数据库脚本中的set define off

2018年8月6日15:11:34 Oracle数据库脚本中的set define off 前言 最近在公司写需求,接触到脚本,第一句set define off;就不知道什么意思了,查询后记录之。 名称 SET DEFINE 概要 SET DEFINE命令改变标记替代变量的前缀字符。你可以使用SET DEFINE关闭替代变量。 语法 SET DEF[IN...