本文分享下Spring boot项目下使用JPA操作数据库时关于ID生成器的相关实现代码 。
在JPA中一个数据表必须要有主键,主键类型一般是推荐使用Long类型,那么在分布式微服务下需要保证ID的唯一性,此时往往需要自定义主键生成策略 。
首先实现一个实体类的基类,在基类中定义ID的生成策略,子类继承其实现,这样就不用每个实体类都去写一遍了 。
package com.demo.entity;import com.fasterxml.jackson.annotation.JsonFormat;import org.hibernate.annotations.GenericGenerator;import JAVAx.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.MAppedSuperclass;import java.io.Serializable;/** * @author majianzheng */@MappedSuperclasspublic abstract class AbstractBaseEntity implements Serializable {protected Long id;/*** 获取主键id* @return id* 前端js能处理的长度低于Java,防止精度丢失*/@Id@GenericGenerator(name="snowFlakeIdGenerator", strategy="com.demo.idgenerator.SnowFlakeIdGenerator")@GeneratedValue(generator="snowFlakeIdGenerator")@JsonFormat(shape = JsonFormat.Shape.STRING)public Long getId() {return id;}/*** 设置主键id* @param id 主键id*/public void setId(Long id) {this.id = id;}}
上述代码中,如下的注解,strategy表示生成策略实现类 。
@GenericGenerator(name="snowFlakeIdGenerator", strategy="com.demo.idgenerator.SnowFlakeIdGenerator")
接下来开始编写雪花算法代码,先简单介绍下雪花算法 。
SnowFlake 算法(雪花算法),是 Twitter 开源的分布式 id 生成算法 。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id 。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增 。
文章插图
雪花算法
接下来实现上面的实体类基类中提到的
推荐阅读
- 食堂禁止喧哗标语 大学食堂迎新生横幅标语
- 厦门小学生军事化冬令营 厦门大学暑期夏令营
- 唇炎用什么牙膏
- 嗓子疼可以吃鸡蛋吗
- 什么是传统普洱茶,什么是普洱茶熟茶和普洱茶生茶
- 网友热议|新郎新娘同名同姓同年生 两家相距不足百米!网友:娃娃可以叫洋幂
- 青铜葵花的故事是真的吗 青铜葵花为什么不让小学生看了
- 火炬之光手游老玩家给你一点人生经验 火炬之光无限手游
- 狂人日记读后感800字 狂人日记读后感1000字大学生
- 女生喝什么茶对皮肤好,女生适合喝什么茶