博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring boot JPA 用自定义主键策略 生成自定义主键ID
阅读量:6183 次
发布时间:2019-06-21

本文共 2020 字,大约阅读时间需要 6 分钟。

最近学习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.com12  * @version 1.013  * @date 2018-12-08 15:4214  */15 public class CustomIDGenerator extends IdentityGenerator {16     @Override17     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

你可能感兴趣的文章
字符编码笔记:ASCII,Unicode和UTF-8
查看>>
Java中的String,StringBuilder,StringBuffer三者的区别
查看>>
ubuntu 下修改MySQL 的root用户密码
查看>>
java线程总结
查看>>
MVC框架显示层——Velocity技术
查看>>
POI通过模板导出EXCEL文件
查看>>
进一步理解动态规划
查看>>
MySQL日志管理
查看>>
win7硬盘安装_win7系统安装教程
查看>>
nconf修改密码
查看>>
交换机密码破解
查看>>
linux下PHP手动添加扩展库
查看>>
httpd设置HTTPS双向认证
查看>>
php中设置错误报告级别error_reporting()
查看>>
微信小程序的app.json配置(二)
查看>>
Mysql
查看>>
linux 历史(histroy)命令记录过滤
查看>>
【COCOS2DX-LUA 脚本开发之八】使用Lua实现Http交互
查看>>
关于自己的苹果手机——排查APP是否中招XCODE
查看>>
Silverlight实用窍门系列:71.Silverlight的Style
查看>>