Hibernate 之主键生成策略小总结
主键生成策略大致分两种:
- 手工控制策略
- 自动生成策略【框架自动生成和数据库自动生成】
手工控制策略:
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 之主键生成策略小总结的更多相关文章
- 大家一起撸代码之——Hibernate各种主键生成策略与配置详解
1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...
- Hibernate各种主键生成策略与配置详解
出自:http://www.cnblogs.com/kakafra/archive/2012/09/16/2687569.html 1.assigned 主键由外部程序负责生成,在 save() 之前 ...
- Hibernate各种主键生成策略与配置详解《转》
1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...
- Hibernate各种主键生成策略与配置详解【附1--<generator class="foreign">】
1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...
- 【转】Hibernate各种主键生成策略与配置详解
原文转自:Fra~~kaka's Blog 1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无 ...
- hibernate 各种主键生成策略(转)
http://www.cnblogs.com/kakafra/archive/2012/09/16/2687569.html 1.assigned 主键由外部程序负责生成,在 save() 之前必须指 ...
- Hibernate各种主键生成策略与配置详解(转)
原文链接:http://www.cnblogs.com/hoobey/p/5508992.html 1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate ...
- hibernate 注解 主键生成策略
一.JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue ...
- Hibernate中主键生成策略
主键生成策略 increment identity sequence native uuid assigned 1) increment 由hibernate完成 主键递增, 原理:select ma ...
随机推荐
- $watch和$observe的使用
$observe 是Attribute对象的一个方法,用来监听DOM中属性值的变化.比如 attr1="{{name}}" Attribute定义在directive中的link函 ...
- git删除所有提交历史记录
这种方式是最快最有效的 进项目根目录启动git bash,然后执行这些即可 最后的 git push -f origin master 会失败,直接在idea里push就能成功了 .Checkout ...
- SpringBoot日记——国际化篇
听起来高大上的国际化,起始就是在利用浏览器语言,或者页面中的中英文切换,将页面的文字在其他语言和中文进行切换,比如: 我们想让这个功能实现,点击中文,页面就是中文的,点击英文就是英文的. 国际化配置 ...
- APP性能测试中的几个重要概念
转载一篇文章,关于app性能测试的几个概念,对于想要接触app测试的朋友或许有些帮助. 我们在使用各种 App 的时候基本会关注到:这款软件挺耗流量的?运行起来设备掉电有点快嘛?切换页面的时候还会有卡 ...
- Java多线程多个线程wait(),一个notify()唤醒,唤醒的顺序
package thread; public class ThreadWN implements Runnable { public String name; public String getNam ...
- 搭建OpenSTF+Jenkins持续集成环境的协同开发
最近在研究如何将OpenSTF与Jenkins进行协同开发,刚刚爬梯子看了些资料,赶紧记录下来. 转载请注明出处:https://www.cnblogs.com/v88v/p/10405338.htm ...
- C# 连接MongoDB,含用户验证
配置文件中链接地址:mongodb://test:123456@192.168.168.186:9999/temp 读取配置文件: /// <summary> /// 构造函数 /// & ...
- idea_debug
条件断点 快捷键 cmd + shift +f8 demo 表达式求值 注意,调试的时候,选中相应变量 alt + f8 demo set value (感觉会非常有用) 调试时直接改变变量的值,快捷 ...
- tomcat启动项目的时候不报错而且启动的很快
最后发现是tomcat部署项目的时候,并没有将一部分文件复制到tomcat的目录下 方法 将没有添加的目录 Finish
- Stack Overflow访问问题的处理
一直以来都有访问stackoverflow的习惯,但是老是因为js的问题让人很多操作都操作不了,而且打开的速度也很慢. 原因其实就是stackoverflow使用的google的cdn,于是想彻底一点 ...