Spring boot JPA 用自定义主键策略 生成自定义主键ID
最近学习Spring boot JPA 学习过程解决的一些问题写成随笔,大家一起成长。
这次遇到自定义主键的问题
package javax.persistence;
public enum GenerationType {
TABLE,
SEQUENCE,
IDENTITY,
AUTO;
private GenerationType() {
}
}
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生成类
package com.muyuer.springdemo.core; import com.muyuer.springdemo.utils.SnowflakeIdHelper;
import org.hibernate.MappingException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentityGenerator;
import java.io.Serializable; /**
* 自定义ID生成器
* @author muyuer 182443947@qq.com
* @version 1.0
* @date 2018-12-08 15:42
*/
public class CustomIDGenerator extends IdentityGenerator {
@Override
public Serializable generate(SharedSessionContractImplementor session, Object object) throws MappingException {
Object id = SnowflakeIdHelper.getId();
if (id != null) {
return (Serializable) id;
}
return super.generate(session, object);
}
}
这里Override了generate方法通过SnowflakeIdHelper.getId();返回了自定义的ID。
注意:我测试的ID是Long类型所以这里继承的是IdentityGenerator类,如果ID为String类型的话应该继承 UUIDGenerator 或者 UUIDGenerator
Spring boot JPA 用自定义主键策略 生成自定义主键ID的更多相关文章
- Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题
(转载)Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题 这几天在用spring boot开发项目, 在开发的过程中遇到一个问题hibernate在执 ...
- Spring Boot JPA 使用教程
JPA 是 Spring Boot 官方推荐的数据库访问组件,其充分体现了面向对象编程思想,有点像 asp.net 的 EFCore.JPA 也是众多 ORM 的抽象. 从本系列开始,都需要用到 my ...
- spring boot JPA中实体类常用注解
spring boot jpa中的注解很多,参数也比较多.没必要全部记住,但是经常查看官方文档也比较麻烦,记录一下一些常用的注解.通过一些具体的例子来帮助记忆. @Entity @Table(name ...
- spring boot jpa 使用update 报错解决办法
在spring boot jpa 中自定义sql,执行update操作报错解决办法: 在@Query(...)上添加 @Modifying@Transactional注解
- Spring Boot(五):Spring Boot Jpa 的使用
在上篇文章Spring Boot(二):Web 综合开发中简单介绍了一下 Spring Boot Jpa 的基础性使用,这篇文章将更加全面的介绍 Spring Boot Jpa 常见用法以及注意事项. ...
- Spring Boot Jpa 的使用
Spring Boot Jpa 介绍 首先了解 Jpa 是什么? Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范.它为 Java 开发人员提供了一种 ...
- (转)Spring Boot(五):Spring Boot Jpa 的使用
http://www.ityouknow.com/springboot/2016/08/20/spring-boot-jpa.html 在上篇文章Spring Boot(二):Web 综合开发中简单介 ...
- Spring Boot JPA 连接数据库
本文将介绍怎样在Spring Boot project中加入JPA作为持久化方式. 改动 pom.xml 依赖 与上一篇介绍的 jdbc 不同的是 spring-boot-starter-jdbc 改 ...
- Spring Boot JPA中使用@Entity和@Table
文章目录 默认实现 使用@Table自定义表格名字 在JPQL Queries中重写表格名字 Spring Boot JPA中使用@Entity和@Table 本文中我们会讲解如何在Spring Bo ...
随机推荐
- golang中 "下划线" 的用法
1.忽略返回值 这个应该是最简单的用途,比如某个函数返回三个参数,但是我们只需要其中的两个,另外一个参数可以忽略,这样的话代码可以这样写: v1, v2, _ := function(...) 2.用 ...
- openvpn 初步使用
服务端:Centos 7.2 openvpn 2.4.3 客户端:Windows 10 安装包 openvpn的官网在国内访问不了,服务端通过yum安装,客户端在第三方网站下载的 一般的国内源应该都包 ...
- Spring IOC 注入方式详解 附代码
引言 Spring框架作为优秀的开源框架之一,深受各大Java开发者的追捧,相信对于大家来说并不陌生,Spring之所以这么流行,少不了他的两大核心技术IOC和IOP.我们这里重点讲述Spring框架 ...
- XGpio函数
头文件 #include"xgpio.h" int XGpio_Initialize(XGpio * InstancePtr, u16 DeviceId) 功能:初始化GPIO 参 ...
- 4、zabbix基本配置入门
Zabbix监控流程: Host group --> Hosts(向server端添加被监控主机) --> Application(在agent定义) --> Items(在appl ...
- Webpack与其他打包工具的区别
webpack是一个模块化加载器兼打包工具,它同时支持AMD.CMD等加载规范.与其他模块化加载器相比,它有这些优势: 1.代码分割 webpack支持两种依赖加载:同步和异步.同步的依赖会在编译时直 ...
- 去除pt种里tracker的方法
1.下载BEncode Editor,打开 2.把下载的种子拖进去,可以看到这样的: tracker就是箭头指的地方,这个包含了个人帐号独一无二的私钥,如果泄露给别人的话别人下载就是走的你的帐号,轻则 ...
- python 获取subprocess进程执行后返回值
test.py #coding=utf- import subprocess compilePopen = subprocess.Popen('gcc haha',shell=True,stderr= ...
- postman(三):添加断言
进行接口测试时,添加断言时必不可少的,断言就是判断响应内容与预期返回是否一致 进行接口测试时,添加断言时必不可少的,断言就是判断响应内容与预期返回是否一致 postman可以在请求模块的Tests ...
- ionic3开发ios端
ionic框架是一端开发,三端适用(android端,ios端,web端),意思是在其中一端开发的代码,拿到另外两端,代码同样生效 那现在就说一下在web端开发拿到ios端开发前需要做的事情 开发io ...