• 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

  • 相关阅读:
    tar.xz文件如何解压
    warnings and errors when executing : make -j4
    ubuntu关机
    Linux系统kernel编译替换升级
    安装linux内核
    二叉树的度数和节点数的关系
    刷题--将搜索二叉树转换成双向链表
    刷题--二叉搜索树与双向链表
    刷题--删除链表中重复的节点
    四舍五入输出
  • 原文地址:https://www.cnblogs.com/DevMuYuer/p/10088425.html
Copyright © 2020-2023  润新知