当前位置: 首页 > news >正文

Spring boot JPA 用自定义主键策略 生成自定义主键ID

最近学习Spring boot JPA 学习过程解决的一些问题写成随笔,大家一起成长。
这次遇到自定义主键的问题
 1 package javax.persistence;
 2 
 3 public enum GenerationType {
 4     TABLE,
 5     SEQUENCE,
 6     IDENTITY,
 7     AUTO;
 8 
 9     private GenerationType() {
10     }
11 }
GenerationType源码

从源码中可以看出JPA提供的四种标准主键策略TABLE,SEQUENCE,IDENTITY,AUTO

TABLE:使用一个特定的数据库表格来保存主键。

SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。 这个值要与generator一起使用,generator 指定生成主键使用的生成器(可能是orcale中自己编写的序列)。

IDENTITY:主键由数据库自动生成(主要是支持自动增长的数据库,如mysql)

AUTO:主键由程序控制,也是GenerationType的默认值。

 

不写GeneratedValue注解时即为GenerationType.AUTO 这时主键生成是根据数据库hibernate_sequence里的next_val来生成但我想用自已规则来生成自己的ID查了半天的资料终于解决这个问题。

自定义生成的ID,看到效果出来那个兴奋啊,新手对java的一堆注解还是真的不容易上手。

下面是具体代码

1.在实体主键get方法添加注解

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "custom-id")     @GenericGenerator(name = "custom-id", strategy = "com.muyuer.springdemo.core.CustomIDGenerator")
    @Column(name = "user_id")
    public Long getUserId() {
        return userId;
    }

注意:GeneratedValue中的generator要与GenericGenerator中的name相等 上面代码中是"custom-id"

 2.添加自定义ID生成类

 1 package com.muyuer.springdemo.core;
 2 
 3 import com.muyuer.springdemo.utils.SnowflakeIdHelper;
 4 import org.hibernate.MappingException;
 5 import org.hibernate.engine.spi.SharedSessionContractImplementor;
 6 import org.hibernate.id.IdentityGenerator;
 7 import java.io.Serializable;
 8 
 9 /**
10  * 自定义ID生成器
11  * @author muyuer 182443947@qq.com
12  * @version 1.0
13  * @date 2018-12-08 15:42
14  */
15 public class CustomIDGenerator extends IdentityGenerator {
16     @Override
17     public Serializable generate(SharedSessionContractImplementor session, Object object) throws MappingException {
18         Object id =  SnowflakeIdHelper.getId();
19         if (id != null) {
20             return (Serializable) id;
21         }
22         return super.generate(session, object);
23     }
24 }

 这里Override了generate方法通过SnowflakeIdHelper.getId();返回了自定义的ID。

注意:我测试的ID是Long类型所以这里继承的是IdentityGenerator类,如果ID为String类型的话应该继承 UUIDGenerator 或者 UUIDGenerator

转载于:https://www.cnblogs.com/DevMuYuer/p/10088425.html

相关文章:

  • java 环境 eclipse 配置
  • 福大软工 · 第十次作业 - 项目测评(团队) [已完成]
  • Html页面插入flash代码
  • 关于自定义 Alert
  • C#练习4
  • python 基础语法 - 函数(一)
  • Mysql在sql中截取时间类型字段的年月日
  • 小议C#接口的隐式与显示实现
  • 【node】搭建自己的博客开坑(一)——项目的构思与设计——(后端部分)
  • linux内核管理--之定制一个属于自己的小型系统
  • 十二月技术考核:Windows系统故障排查
  • Android 之 内存管理
  • 尝试使用Open Live Writer写博客
  • 敏捷 扑克上的时间估算(转)
  • 码云新增GVP(最有价值)项目(10、11月合辑) | 码云周刊第 90 期
  • [LeetCode] Wiggle Sort
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • js写一个简单的选项卡
  • js作用域和this的理解
  • Node 版本管理
  • TCP拥塞控制
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 从重复到重用
  • 第十八天-企业应用架构模式-基本模式
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 前端之Sass/Scss实战笔记
  • 使用Gradle第一次构建Java程序
  • 思否第一天
  • 国内开源镜像站点
  • ​Python 3 新特性:类型注解
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #pragma once
  • $ git push -u origin master 推送到远程库出错
  • $NOIp2018$劝退记
  • (3)选择元素——(17)练习(Exercises)
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (四)库存超卖案例实战——优化redis分布式锁
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (转)http协议
  • (转)大道至简,职场上做人做事做管理
  • ./和../以及/和~之间的区别
  • .bat文件调用java类的main方法
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net wcf memory gates checking failed
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET程序员迈向卓越的必由之路
  • .Net的DataSet直接与SQL2005交互
  • .net通用权限框架B/S (三)--MODEL层(2)