jpa创建自定义UUID,且符合IETF RFC 4122,不会出警告

先说下自己创建uuid的好处,就是可以自己指定id,自己不指定的时候自己生成,更加灵活,而默认的是声明以后,自己再传进去的id就会被忽略。

默认的注解生成方式如下:

java 复制代码
    @Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(name = "UUID",strategy = "org.hibernate.id.UUIDGenerator")
    @Column(name = COLUMN_ID_NAME, nullable = false)
    public String getId() {
        return id;
    }

下面是自己继承重写:

java 复制代码
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.UUIDGenerator;
import org.hibernate.id.uuid.StandardRandomStrategy;
import org.hibernate.type.descriptor.java.UUIDTypeDescriptor;

import java.io.Serializable;
import java.lang.reflect.Field;

/***
 * 自定义的主键生成器,替代org.hibernate.id.UUIDGenerator
 * 可以实现自己设置uuid时采用自己设置的,不设置使用默认的
 * @author yishuo
 * @date 2023/11/26 4:52:16
 */
public class MyUUIDUtil  extends UUIDGenerator {
    @Override
    public Serializable generate(SharedSessionContractImplementor session, Object obj) {
        try {
            Field field = obj.getClass().getDeclaredField("id");
            field.setAccessible(true);
            String id = (String) field.get(obj);
            if (id!=null) {
                return id.substring(0,32);
            }
        } catch (NoSuchFieldException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
        return UUIDTypeDescriptor.ToStringTransformer.INSTANCE.transform( StandardRandomStrategy.INSTANCE.generateUUID( session ) ).replace("-","");
    }
}

我是存的32长度的id,所以把"-"去掉了,采用这种方式不会警告:does not generate IETF RFC 4122 compliant UUID values

使用自己重写的UUID协议,也类似上面,如下:

java 复制代码
    @Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(name = "UUID",strategy = "com.yishuo.xst.util.MyUUIDUtil")
    @Column(name = COLUMN_ID_NAME, nullable = false)
    public String getId() {
        return id;
    }
相关推荐
学长毕设8 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw9 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号10 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场10 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠11 小时前
泛微OAe9-后端二开异步调用
java
秋天的怀念_David11 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
外收内放12 小时前
Python基础语法练习题(73)
java·前端·python
Wang's Blog12 小时前
Java 项目实战: 交友项目 - 环信后台发送消息测试
java·交友
用户37215742613512 小时前
Java 操作 Word 脚注和尾注:添加、读取与删除
java
小嘉丶学长12 小时前
Day14 · 字典与集合
java·开发语言·网络·python·学习·1024程序员节