最近学习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的更多相关文章

  1. Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题

      (转载)Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题   这几天在用spring boot开发项目, 在开发的过程中遇到一个问题hibernate在执 ...

  2. Spring Boot JPA 使用教程

    JPA 是 Spring Boot 官方推荐的数据库访问组件,其充分体现了面向对象编程思想,有点像 asp.net 的 EFCore.JPA 也是众多 ORM 的抽象. 从本系列开始,都需要用到 my ...

  3. spring boot JPA中实体类常用注解

    spring boot jpa中的注解很多,参数也比较多.没必要全部记住,但是经常查看官方文档也比较麻烦,记录一下一些常用的注解.通过一些具体的例子来帮助记忆. @Entity @Table(name ...

  4. spring boot jpa 使用update 报错解决办法

    在spring boot jpa 中自定义sql,执行update操作报错解决办法: 在@Query(...)上添加 @Modifying@Transactional注解

  5. Spring Boot(五):Spring Boot Jpa 的使用

    在上篇文章Spring Boot(二):Web 综合开发中简单介绍了一下 Spring Boot Jpa 的基础性使用,这篇文章将更加全面的介绍 Spring Boot Jpa 常见用法以及注意事项. ...

  6. Spring Boot Jpa 的使用

    Spring Boot Jpa 介绍 首先了解 Jpa 是什么? Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范.它为 Java 开发人员提供了一种 ...

  7. (转)Spring Boot(五):Spring Boot Jpa 的使用

    http://www.ityouknow.com/springboot/2016/08/20/spring-boot-jpa.html 在上篇文章Spring Boot(二):Web 综合开发中简单介 ...

  8. Spring Boot JPA 连接数据库

    本文将介绍怎样在Spring Boot project中加入JPA作为持久化方式. 改动 pom.xml 依赖 与上一篇介绍的 jdbc 不同的是 spring-boot-starter-jdbc 改 ...

  9. Spring Boot JPA中使用@Entity和@Table

    文章目录 默认实现 使用@Table自定义表格名字 在JPQL Queries中重写表格名字 Spring Boot JPA中使用@Entity和@Table 本文中我们会讲解如何在Spring Bo ...

随机推荐

  1. Linux 进程管理、系统状态查询

    1.内存给进程一段空间让他启动,让内核通过cpu来管理它. 2.ps命令查看命令信息. 用户.pid号.使用cpu.使用内存.虚拟内存.真实内存.控制台.状态.启动时间.运行时间.名 USER PID ...

  2. Java字节码浅析(二)

    英文原文链接,译文链接,原文作者:James Bloom,译者:有孚 条件语句 像if-else, switch这样的流程控制的条件语句,是通过用一条指令来进行两个值的比较,然后根据结果跳转到另一条字 ...

  3. JDK1.7安装和配置及注意事项

    要求 必备知识 windows 7 基本操作. 运行环境 windows 7 下载地址 环境下载 下载JDK 下载地址:http://www.oracle.com/technetwork/java/j ...

  4. 秦皇岛winter camp 总结

    冬令营在秦皇岛自闭了七天,很多题目看了都没有思路,或者是不知道怎么敲代码.我发现图论的题,自己连怎么建树都给忘了,想了半天.还有很多自己从未接触过的算法.在说说课堂上课的情况,大部分时间都是全程懵逼的 ...

  5. BZOJ5487: [Usaco2018 Dec]Cowpatibility

    Description 研究证明,有一个因素在两头奶牛能否作为朋友和谐共处这方面比其他任何因素都来得重要--她们是不是喜欢同 一种口味的冰激凌!Farmer John的N头奶牛(2≤N≤50,000) ...

  6. Git Github的区别 & Pycharm使用GitHub

    首先:git和github功能很强大,随着使用深入,我将随时填充,更新这篇文章,记录随时遇到的新的问题和感悟. 第一次知道github是看廖雪峰的课程,所谓版本管理,之前在辉煌科技用的是SVN,了解一 ...

  7. Codeforces 147 B. Smile House

    题目链接:http://codeforces.com/contest/147/problem/B 求有向图的最小正权环的大小   ${n<=300}$ 非常显然的有${n^{3}log^2}$的 ...

  8. leecode第一百四十六题(LRU缓存机制)

    class LRUCache { private: unordered_map<int, list<pair<int,int>>::iterator> _m; // ...

  9. [Centos7]无法访问配置好的nginx

    Centos7无法访问配置好的nginx 临时生效 # 重启虚拟机,将失效 iptables -I INPUT -p TCP --dport 80 -j ACCEPT 永久有效 # 在防火墙中开放80 ...

  10. mean

    import caffe import numpy as np MEAN_PROTO_PATH = 'mean.binaryproto' # 待转换的pb格式图像均值文件路径 MEAN_NPY_PAT ...