JPA使用雪花算法生成主键ID

2023-11-08

实现方式

  • 通过@GenericGenerator注解自定义主键生成策略
  • 需要实现org.hibernate.id.IdentifierGenerator接口
  • 根据官网例子进行改造,官网链接:https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#identifiers-generators-GenericGenerator
    在这里插入图片描述

引入依赖

这里使用hutool工具包里封装好的雪花算法生成id直接,需引入hutool-all依赖。

   <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.6.2</version>
   </dependency>

实体类父类

业务实体直接继承父类。

strategy 参数为GenerationType.SEQUENCE,使用序列生成id,因此使用的数据库需支持序列。

@Data
@NoArgsConstructor
@AllArgsConstructor
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {

    /**
     * 主键id
     */
    @Id
    @GeneratedValue(generator = "myIdGeneratorConfig",
            strategy = GenerationType.SEQUENCE)
    @GenericGenerator(
            name = "myIdGeneratorConfig",
            strategy = "com.ozoz.misc.config.MyIdGeneratorConfig")
    private Long id;

    /**
     * 创建时间
     */
    @CreatedDate
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(shape = JsonFormat.Shape.STRING,pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(shape = JsonFormat.Shape.STRING,pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;

    /**
     * 删除标记  0是未删除 1是已删除
     */
    private Integer deleteTag;
}

实现IdentifierGenerator

实现IdentifierGenerator,引入雪花算法生成主键id。

@Slf4j
public class MyIdGeneratorConfig implements IdentifierGenerator {

    /**
     * 终端ID
     */
    public static long WORKER_ID = 1;

    /**
     * 数据中心id
     */
    public static long DATACENTER_ID = 1;

    private Snowflake snowflake = IdUtil.createSnowflake(WORKER_ID, DATACENTER_ID);

    @PostConstruct
    public void init() {
        WORKER_ID = NetUtil.ipv4ToLong(NetUtil.getLocalhostStr());
        log.info("当前机器的workId:{}", WORKER_ID);
    }

    public synchronized long snowflakeId() {
        return snowflake.nextId();
    }

    public synchronized long snowflakeId(long workerId, long datacenterId) {
        Snowflake snowflake = IdUtil.createSnowflake(workerId, datacenterId);
        return snowflake.nextId();
    }


    @Override
    public Serializable generate(SharedSessionContractImplementor session, Object object)
            throws HibernateException {
        return snowflakeId(WORKER_ID, DATACENTER_ID);
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPA使用雪花算法生成主键ID 的相关文章

随机推荐

  • vi如何使用

    个人发现好多企业内部运维工程师 很少有人懂得VI的使用技巧 通常都是一顿按 上下左右键 搞得我好郁闷 我本人整理了一份VI的使用技巧分享下 希望大家正确 高效 去工作 Vi 1 Vi 10 进入Vi 以第10行为行首 2 Vi 空格 最后一
  • 以太坊学习笔记:私有链搭建操作指南

    原文链接 https my oschina net u 2349981 blog 865256 讲解的内容非常详细 熟悉搭建以太坊私有链的相关操作 学习了 摘要 详解以太坊私有链搭建过程以及一些常用的操作 虽然以太坊是一个公有链系统 但是我
  • 学算法,先从二分查找开始吧

    总纲 思路很简单 细节是魔鬼 分为三个常用场景 寻找一个数 寻找左侧边界 寻找右侧边界 最后给出力扣上的题目例子 还可以在GitHub上观看哦 AlgorithmNotes 基础框架 int binarySearch int nums in
  • MySQL系列11——索引效率测试

    MySQL索引效率测试 一 以mysql添加索引和不添加索引为例 测试数据的插入速度和查询速度 1 首先创建数据表和数据库 在cmd命令行中执行 create database TestDataSpeed charset utf8 use
  • onnxruntime安装与使用(附实践中发现的一些问题)

    关于onnxruntime的一些基本参考链接 onnxruntime官方文档 将pytorch模型转换为onnx模型并用onnxruntime进行推理 Pytorch官方文档 一 onnxruntime安装 1 使用CPU 如果只用CPU进
  • ice服务器回归系统,便携式的ICE中继服务器及其方法

    主权项 1 一种便携式的ICE中继服务器 该ICE中继服务器是分别与一网络终 端装置及一NAT路由器相连接 其特征在于 至少包括 一储存单元 用以储存依据ICE协议标准所提供的多个候选接入点 一第一输出入端口 与该网络终端装置相连接 用以接
  • Mysql中key 、primary key 、unique key 与index区别

    索引被用来快速找出在一个列上用一特定值的行 没有索引 MySQL不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行 表越大 花费时间越多 如果表对于查询的列有一个索引 MySQL能快速到达一个位置去搜寻到数据文件的中间 没有必要考
  • 蚂蚁开放联盟链合约开发入门

    蚂蚁链简介 蚂蚁链包含多个产品 合约体验链 开放联盟链 联盟链 合约体验链 一条本地开发体验链 供您免费体验本地开发的全流程 网址 联盟链 可以创建或加入联盟 门槛较高 网址 开放联盟链 面向企业和开发者提供的 无需搭链 快速上链 接近公链
  • 菜鸟学Java public static void main(String[] args) 是什么意思?

    目录 1 经典程序解析 2 包里面的多个类 2 1 全限定名调用程序 2 2 包名的层数 2 3 类中main位置的选择 2 4 不同包中类的调用 3 void位置返回值 4 同一个包内的类调用 5 public位置选择 6 String
  • ES6:Promise详解

    ES6 Promise详解 1 概念 2 Promise有3种状态 3 Promise和async和await的区别 4 Promise API 5 Promise是用来解决两个问题的 6 Promise的三个缺点 7 Promise的两个
  • 性能测试工具有哪些?原理是什么?怎么选择适合的工具?

    前言 本篇文章主要简单总结下性能测试工具的原理以及如何选型 性能测试和功能测试不同 性能测试的执行是基本功能的重复和并发 需要模拟多用户 在性能测试执行时需要监控指标参数 同时性能测试的结果不是那么显而易见 需要对数据进行分析 这些特点决定
  • 【ROS】ROS 初学笔记

    ROS是什么
  • 万能密码原理和总结

    我们所常说的 or or 万能密码的原理是这样的 SQL语句sql select from user where username username and pass pass 当我们用户名和密码都填写 or or 提交的时候 即此时语句中
  • Kubernetes中的etcd访问

    前言 Kubernetes中的etcd访问 正常安装了k8s 没有特意去安装etcd 利用K8s中附带的etcd 感受一下etcd的读写操作 提示 以下是本篇文章正文内容 下面案例可供参考 一 etcd是什么 etcd是一个分布式的key
  • UE4换装系统(合并骨骼模型)

    前面那篇UE4换装系统https blog csdn net luomogenhaoqi article details 88350580 事实上每个身体模型还是各自渲染 现在介绍把每个身体模型合并输出一个模型 把Lod 材质 网格等合并
  • 软件工程第二版(判断题答案)

    判断题 第一章 软件就是程序 编写软件就是编写程序 软件危机的主要表现是软件需求增加 软件价格上升 软件工程学科出现的主要原因是软件危机的出现 软件工具的作用是为了延长软件产品的寿命 第二章 瀑布模型的最大优点是将软件开发的各个阶段划分得十
  • Notepad++ 配置 支持jquery、html、css、javascript、php代码提示

    官网下载 http notepad plus plus org 获取插件的方法 打开软件 窗口工具栏有有一个问号 点获取插件 我使用的插件 安装方法都是官方的方法 QuickText v0 2 1 zip 自定义缩写词 按快捷键后输出 定义
  • Java网络编程Socket(使用字节流)

    套接字 Socket 开发网络应用程序被广泛采用 以至于成为事实上的标准 Socket通信原理 通信的两端都要有Socket 是两台机器间通信的端点 网络通信其实就是Socket间的通信 Socket允许程序把网络连接当成一个流 数据在两个
  • java private 构造函数_JAVA private私有类的 默认构造函数 的生成过程

    如果一个类没有定义任何构造函数 则编译器将生成一个缺省的构造函数 该构造函数的访问修改符和类的访问修改符相同 例如 class test将生成test 构造函数 public class test将生成public test 构造函数 在使
  • JPA使用雪花算法生成主键ID

    实现方式 通过 GenericGenerator注解自定义主键生成策略 需要实现org hibernate id IdentifierGenerator接口 根据官网例子进行改造 官网链接 https docs jboss org hibe