JPA自定义ID生成器,雪花算法实现代码分享

本文分享下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 引入了时间戳,基本上保持自增 。

JPA自定义ID生成器,雪花算法实现代码分享

文章插图
雪花算法
 
接下来实现上面的实体类基类中提到的


    推荐阅读