spring data jpa、Hibernate开启全球唯一UUID设置
spring data jpa、Hibernate开启全球唯一UUID设置
原文链接:https://www.cnblogs.com/blog5277/p/10662079.html
原文作者:博客园--曲高终和寡
*******************如果你看到这一行,说明爬虫在本人还没有发布完成的时候就抓走了我的文章,导致内容不完整,请去上述的原文链接查看原文****************
UUID这个东西,具体的我就不讲了,网上的内容很多,我这里就随便放一个大家看一下就了解了
https://www.jianshu.com/p/d77f3ef0868a
这里面有关于发号器,UUID的介绍,具体各位是使用UUID的哪个版本,或者使用雪花ID,或者使用其他别的方式,请各位自行判断
在我的业务里面呢:
1.准备部署至少两台服务器,且两台服务器时区不一样,一台阿里云香港,东八区,一台美国洛杉矶,多少区忘了,反正有13个小时的时差,
——雪花ID的方案就被我否了,因为我不能保证美国那台服务器的时区不会根据冬夏令时来回跳,雪花ID在时钟回拨的情况下会一直等候,我也不需要雪花ID有序这个优点。
2.同样为了容灾,我准备在两台服务器分别部署数据库
——主键自增的方案就被我否了,迁移有点麻烦了
3.我不需要主键来排序,我选用的PostgresQL也不会因为主键是字符型的而导致插入、读取变快
——所以我不需要一切主键需要有序的生成方案,UUID完美符合我的需求
4.既然选用了UUID,我就希望它在任何情况下都不会重复,全球唯一
——那么UUID的生成方案2.3.4.5就都不满足我的要求了,虽然概率极地,但是还是有理论上重复的可能性的
5.UUID的方案1存在一定的危险性,是根据MAC地址(或者IP)生成的,那么理论上能根据MAC地址找到所在地
——。。。然后呢。。。?我一台服务器/IP在香港,一台服务器/IP在洛杉矶,想通过这俩地方来找我怕是不太可能嗷。。。更何况我写的东西根本就不会有多少人用,更没有什么法律风险不担心被查水表,更没有什么价值。。。?谁会来搞我?
所以,最终选用了方案1的UUID生成方法,不可能重复,我开发的时候就不用考虑这种极小概率会导致的BUG,放心大胆的用就是了。
而生成方案1的UUID有很多工具包,比如Apache common 的UUID 包,还有github上一个项目 JAU,项目地址:
https://github.com/cowtowncoder/java-uuid-generator
我太懒了,不想在项目里引入一个包,就为了生成UUID。。。所以就查了一下,原来HIbernate对生成UUID方案1还做了优化:
Version1变种 – Hibernate
Hibernate的CustomVersionOneStrategy.java,解决了之前version 1的两个问题
- 时间戳(6bytes, 48bit):毫秒级别的,从1970年算起,能撑8925年….
- 顺序号(2bytes, 16bit, 最大值65535): 没有时间戳过了一秒要归零的事,各搞各的,short溢出到了负数就归0。
- 机器标识(4bytes 32bit): 拿localHost的IP地址,IPV4呢正好4个byte,但如果是IPV6要16个bytes,就只拿前4个byte。
- 进程标识(4bytes 32bit): 用当前时间戳右移8位再取整数应付,不信两条线程会同时启动。值得留意就是,机器进程和进程标识组成的64bit Long几乎不变,只变动另一个Long就够了。
Hibernate解决了Version1的两个问题,哪两个问题呢:
但好像Version 1就没考虑过一台机器上起了两个进程这类的问题,也没考虑相同时间戳的并发问题
很好,HIbernate解决了这俩问题,那完美符合我的需求,并且本来项目就引入了JPA,官方支持岂不美哉?
废话说了那么多,配置只需要两行的事,然而这个配置国内网站几乎找不到,困扰了我很久怎么在Hibernate里面设置选用CustomVersionOneStrategy.java,作为主键生成策略的
- /**
- * @Author:ShadowSaint
- * @Date:19-4-3 上午4:56
- * @Description: TODO
- */
- @MappedSuperclass
- @Data
- @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
- public class BaseDomain {
- @Id
- @GenericGenerator(
- name = "uuid2",
- strategy = "uuid2",
- parameters = {@org.hibernate.annotations.Parameter(
- name = "uuid_gen_strategy_class",
- value = "org.hibernate.id.uuid.CustomVersionOneStrategy")
- })
- @GeneratedValue(generator = "uuid2")
- private String id;
- @Column
- private LocalDateTime gmtCreate;
- @Column
- private LocalDateTime gmtModified;
- public void initInsert() {
- this.gmtCreate = LocalDateTime.now();
- this.gmtModified = LocalDateTime.now();
- }
- public void initUpdate() {
- this.gmtModified = LocalDateTime.now();
- }
- }
这样就可以了,以后每一个DO都继承这个BaseDomain,ID就自动生成Hibernate优化版的版本1UUID了
spring data jpa、Hibernate开启全球唯一UUID设置的更多相关文章
- Spring Boot 2.x 之 Spring Data JPA, Hibernate 5
1. Spring Boot常用配置项 基于Spring Boot 2.0.6.RELEASE 1.1 配置属性类 spring.jpa前缀的相关配置项定义在JpaProperties类中, 1.2 ...
- spring data jpa hibernate jpa 三者之间的关系
JPA规范与ORM框架之间的关系是怎样的呢? JPA规范本质上就是一种ORM规范,注意不是ORM框架——因为JPA并未提供ORM实现,它只是制订了一些规范,提供了一些编程的API接口,但具体实现则由服 ...
- Spring data jpa hibernate:查询异常java.sql.SQLException: Column '列名' not found
使用spring boot,jap,hibernate不小心的错误: java.sql.SQLException: Column '列名' not found: 这句话的意思是:找不到此列 为什么会出 ...
- Spring Data JPA Hibernate @QueryHints
另一个实例: http://leobluewing.iteye.com/blog/2032396 : 本文内容来源:https://blog.csdn.net/gavinchen1985/articl ...
- Spring Data Jpa(Hibernate) OneToMany
这个其实非常简单.假设有topic 和 subscriber两个实体类,不考虑关联关系,则连个类的代码如下: /** * Created by csonezp on 2017/8/31. */ @En ...
- maven springmvc spring data jpa hibernate sqlserver demo
搭建费了半天费,各种报错,缺少各种jar包,不兼容等,给那些没弄过的一个参考. 点击我下载
- 转:spring data jpa、 hibernate、 jpa 三者之间的关系
原文链接:spring data jpa. hibernate. jpa 三者之间的关系 spring data jpa hibernate jpa 三者之间的关系 JPA规范与ORM框架之间的关系是 ...
- Spring Data JPA Tutorial Part Nine: Conclusions(未翻译)
This is the ninth and the last part of my Spring Data JPA tutorial. Now it is time to take a look of ...
- Spring Data JPA 和MyBatis比较
现在Dao持久层的解决方案中,大部分是采用Spring Data JPA或MyBatis解决方案,并且传统企业多用前者,互联网企业多用后者. Spring Data JPA 是Spring Data ...
随机推荐
- Jenkins+Jmeter持续集成笔记(五:问题优化)
通过前面的一系列文章,我的API自动化测试平台已经搭建成型,但是要投入具体项目使用时,还有以下几个问题需要优化. 还是接着以上一篇笔记中的“test_token”项目为例: 1.邮件通知问题 (1)问 ...
- git reset与git revert的区别
http://alpha-blog.wanglianghome.org/2010/07/30/git-partial-rollback/ reset(版本撤回) 格式 git reset [-q] [ ...
- DAX/PowerBI系列 - 查询参数用法详解(Query Parameter)
PowerBI - 查询参数用法详解(Query Parameter) 很多人都不知道查询参数用来干啥,下面总结一下日常项目中常用的几个查询参数的地方.(本人不太欢hardcode的东西) 使用查询 ...
- c++ 程序崩溃生成Dump文件
#include "Windows.h"#include "DbgHelp.h" int GenerateMiniDump(PEXCEPTION_POINTER ...
- 关于Ajax的认识和封装(小记)
一,Ajax 的概念 1,Ajax 是一种在无需重新加载整个网页(即刷新网页)的情况下,能够更新部分网页的技术. 2,Ajax 的全称是Asynchronous Javascript And XML” ...
- Java面试宝典(2018版)
置顶 2018年11月10日 23:49:18 我要取一个响亮的昵称 阅读数:8893 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/chen ...
- vector创建二位数组
默认初始化vector vector<vevtor<int> > arr(row, vector<int>(col, 0)); //指定行大小为row,列为col, ...
- day12 python作业:员工信息表
作业要求: 周末大作业:实现员工信息表文件存储格式如下:id,name,age,phone,job1,Alex,22,13651054608,IT2,Egon,23,13304320533,Tearc ...
- css基础重点内容总结
一.目录引入 ./同级(当前) ../上级目录 ../../上上级目录 二.标签种类: 1.块级标签(block):独占一行,宽高可设: 2.行内块标签(inline-block):不独占一行,宽高 ...
- Web Deploy 发布网站错误 检查授权和委派设置
Web Deploy发布ASP.NET网站给我们提供方便,配置好后可以很方便地发布网站到IIS服务器. 自安装Web Deploy一年以来,一直都用得好好地. 直到最近,Gitlab-CI自动发布出了 ...