zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    linux常用命令的英文单词缩写
    Linux常用指令总结
    java exception "file not found or file not exist"
    Linux清空屏幕和清空当前输入的快捷键
    巨蟒python全栈开发-第10天 函数进阶
    为什么不能在函数中给全局变量赋值?
    巨蟒python全栈开发-第9天 初识函数
    巨蟒python全栈开发-第8天 文件操作
    windows10怎样关闭,开机启动项中不需要的应用?
    巨蟒python全栈开发-第7天 基本数据类型补充&深浅拷贝
  • 原文地址:https://www.cnblogs.com/DevMuYuer/p/10088425.html
Copyright © 2011-2022 走看看