主键生成策略大致分两种:

  • 手工控制策略
  • 自动生成策略【框架自动生成和数据库自动生成】

手工控制策略:

assigned:类型是任意的,需要在 save() 到数据库前,编码人员手工设置主键值,也就是调用对象的 setter方法进行赋值操作。

注:可以跨数据库,但是手动控制不能保证不重复,不推荐使用。

自动生成策略:

1 . uuid:自动生成 32 位及以上的随机字符串,生成的依据包括但不限于网卡地址,时间值等。

注:可以跨数据库,效率高,能保证唯一性,推荐使用【虽然占用空间大】

2 . increment:自动获取数据库中主键的最大值【整数型】,自动加一后赋值给对象。

注:可以跨数据库,但是不适合群集下使用,多线程并发更新数据库会取出相同的主键值。

3 . identity:数据库主键设为自动增长【整数型】。

注:适用于MySQL,DB2,SQLserver,不适用于Oracle。

4 . sequence:数据库主键设为自动增长【整数型】。

注:适用于Oracle。

5 . hilo:Hibernate 中最常用的一种生成方式,需要一张额外的表保存 hi 的值。保存 hi 值的表至少有一条记录(只与第一条记录有关),否则会出现错误。

<id name="id" column="id">
<generator class="hilo">
<param name="table">hibernate_hilo</param>
<param name="column">next_hi</param>
<param name="max_lo">100</param>
</generator>
</id> <!-- 指定保存hi值的表名 -->
<param name="table">hibernate_hilo</param>
<!-- 指定保存hi值的列名 -->
<param name="column">next_hi</param>
<!-- 指定低位的最大值 -->
<param name="max_lo">100</param>
<!-- 也可以省略table和column配置,其默认的表为hibernate_unique_key,列为next_hi -->
<id name="id" column="id">
<generator class="hilo">
<param name="max_lo">100</param>
</generator>
</id>

hilo生成器生成主键的过程(以hibernate_unique_key表,next_hi 列为例):

  • 获得hi值:读取并记录数据库的hibernate_unique_key表中next_hi字段的值,数据库中此字段值加1保存。

  • 获得lo值:从0到max_lo循环取值,差值为1,当值为max_lo值时,重新获取hi值,然后lo值继续从0到max_lo循环。
  • 根据公式 hi * (max_lo + 1) + lo计算生成主键值。

注意:当hi值是0的时候,那么第一个值不是0*(max_lo+1)+0=0,而是lo跳过0从1开始,直接是1、2、3……

那max_lo配置多大合适呢?

这要根据具体情况而定,如果系统一般不重启,而且需要用此表建立大量的主键,可以吧max_lo配置大一点,这样可以减少读取数据表的次数,提高效率;反之,如果服务器经常重启,可以吧max_lo配置小一点,可以避免每次重启主键之间的间隔太大,造成主键值主键不连贯。

注:可以跨数据库,hilo算法生成的标志只能在一个数据库中保持唯一。

6 . native:native由hibernate根据使用的数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式,灵活性很强。如果能支持identity则使用identity,如果支持sequence则使用sequence。

注:根据数据库自动选择,项目中如果用到多个数据库时,可以使用这种方式,使用时需要设置表的自增字段或建立序列,建立表等。

7 . foreign:用于一对一关联关系中。

<id name="id" column="id">
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
<one-to-one name="user" class="com.msym.domain.User" constrained="true" />

注:用的少,只用于一对一关联关系【一对一关联关系一般都合为一张表】。

小总结:

主键生成策略

由谁生成OID

数据库id字段类型

兼容数据库

assigned

程序员控制输入

不限定

所有

uuid

Hibernate内部控制输入

字符串类型

所有

increment

Hibernate内部控制输入

整型

所有

identity

数据库底层控制输入

整型自增

Mysql可用

sequence

数据库底层控制输入

整型

Oracle可用

native

数据库底层控制输入

整型自增

所有

Hibernate 之主键生成策略小总结的更多相关文章

  1. 大家一起撸代码之——Hibernate各种主键生成策略与配置详解

    1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...

  2. Hibernate各种主键生成策略与配置详解

    出自:http://www.cnblogs.com/kakafra/archive/2012/09/16/2687569.html 1.assigned 主键由外部程序负责生成,在 save() 之前 ...

  3. Hibernate各种主键生成策略与配置详解《转》

    1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...

  4. Hibernate各种主键生成策略与配置详解【附1--<generator class="foreign">】

    1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...

  5. 【转】Hibernate各种主键生成策略与配置详解

    原文转自:Fra~~kaka's Blog 1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无 ...

  6. hibernate 各种主键生成策略(转)

    http://www.cnblogs.com/kakafra/archive/2012/09/16/2687569.html 1.assigned 主键由外部程序负责生成,在 save() 之前必须指 ...

  7. Hibernate各种主键生成策略与配置详解(转)

    原文链接:http://www.cnblogs.com/hoobey/p/5508992.html 1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate ...

  8. hibernate 注解 主键生成策略

    一.JPA通用策略生成器       通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue ...

  9. Hibernate中主键生成策略

    主键生成策略 increment identity sequence native uuid assigned 1) increment 由hibernate完成 主键递增, 原理:select ma ...

随机推荐

  1. 洛咕P3250 [HNOI2016]网络 整体二分

    这题太神仙了必须写博客... 显然可以想到二分答案.二分一个答案mid,如果所有长度\(\geq mid\)的路径都过x,那么答案一定\(<mid\),否则答案\(\geq mid\). 那么就 ...

  2. java对象是如何创建的

    虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符合引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执行相应的类加载过程. 在类加 ...

  3. 用 Python 带你看《我不是药神》

    我们都是小人物,我们都得了同一种病,我们都穷.——<我不是药神> 我不是程序员 我就是想求求你们,别动不动就拿篇10W+的文章来吓唬人好吗?说点有用的东西好吗?我们需要精神粮食不需要腐蚀精 ...

  4. DNS DHCP 路由 FTP

    第1章 网络基础 1.1 IP地址分类 IP地址的类别-按IP地址数值范围划分 IP地址的类别-按IP地址用途分类 IP地址的类别-按网络通信方式划分 1.2 局域网上网原理过程 DHCP原理过程详情 ...

  5. EVA无法连接

    EVA在11月19日更新后,发现DMS无法与EVA进行链接,在DMS中EVA连接测试报告中有如下报错:   根本原因   解决方法/修复 1.在本地电脑系统盘中查找文件夹“.eva-prod”, 并拷 ...

  6. nginx解析漏洞,配置不当,目录遍历漏洞环境搭建、漏洞复现

    nginx解析漏洞,配置不当,目录遍历漏洞复现 1.Ubuntu14.04安装nginx-php5-fpm 安装了nginx,需要安装以下依赖 sudo apt-get install libpcre ...

  7. charles工具教程

    本文的内容主要包括: Charles 的简介 如何安装 Charles 将 Charles 设置成系统代理 Charles 主界面介绍 过滤网络请求 截取 iPhone 上的网络封包 截取 Https ...

  8. 解决ScrollViewer嵌套的DataGrid、ListBox等控件的鼠标滚动事件无效

    C# 中,两个ScrollViewer嵌套在一起或者ScrollViewer里面嵌套一个DataGrid.ListBox.Listview(控件本身有scrollviewer)的时候,我们本想要的效果 ...

  9. 小佬頭眼里的读研VS工作

    最近小佬頭在各种平台和论坛看到很多临近毕业的本科生在纠结读研和工作.于他们来说,人生到了一个十字路口,需要做出一个选择然后继续前行,今天小佬頭就来聊聊读研和工作的话题. 其实有这个考虑的同学不在少数, ...

  10. SpringCloud 学习(二)-1 :服务注册与发现Eureka扩展

    上一篇介绍了Eureka Server的搭建跟配置.Eureka Client的搭建跟配置.服务间通过服务名调用等,还有几个实际实验中遇到的问题及处理方案,本篇来玩一下Eureka的其他配置. 上一篇 ...