springbootspring boot

spring boot+jpa演示id的生成策略及自定义id

2019-10-05  本文已影响0人  dancer4code

1.spring boot+jpa项目的构建

请参考spring boot+jpa简单实现

2.@Id+@GeneratedValue四种id生成策略

使用GenerationType.IDENTITY(mysql要设置成自增)

package com.dancer4code.actuator.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;
import java.io.Serializable;


@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "student")
public class Student implements Serializable{
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String id;
    private String name;
    private Integer age;
}

JPA提供四种标准用法,由@GeneratedValue的源代码:

    @Target({METHOD,FIELD})    
    @Retention(RUNTIME)    
    public @interface GeneratedValue{    
        GenerationType strategy() default AUTO;    
        String generator() default "";    
    }   

其中GenerationType:

public enum GenerationType{    
    TABLE,    
    SEQUENCE,    
    IDENTITY,    
    AUTO   
} 

JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.

@Id  
@GeneratedValue(strategy = GenerationType.TABLE, generator = "id_sequence")  
@TableGenerator(name = "id_sequence", allocationSize = 1, table = "sequence_table", pkColumnName = "sequence_max_id", valueColumnName = "sequence_count")  
private int id;
@Id  
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_sequence")  
@SequenceGenerator(name = "id_sequence", initialValue = 1, allocationSize = 1, sequenceName = "ID_SEQUENCE")  
private int id;
@Id  
@GeneratedValue(strategy = GenerationType.IDENTITY)  
private int id;
//如果不指定具体的生成规则,则默认为AUTO,即下列两种情况等价
@Id  
@GeneratedValue(strategy = GenerationType.AUTO) 
private String id;

@Id  
private String id;

常用数据库支持生成规则如下:

mysql Oracle PostgreSQL
GenerationType.TABLE
GenerationType.AUTO
GenerationType.IDENTITY x
GenerationType.SEQUENCE x

3.Hibernate主键策略生成

hibernate-5.3.7.Final版本的默认工厂中有14种生成策略,具体可见org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory

public DefaultIdentifierGeneratorFactory() {
        register( "uuid2", UUIDGenerator.class );
        register( "guid", GUIDGenerator.class );            // can be done with UUIDGenerator + strategy
        register( "uuid", UUIDHexGenerator.class );         // "deprecated" for new use
        register( "uuid.hex", UUIDHexGenerator.class );     // uuid.hex is deprecated
        register( "assigned", Assigned.class );
        register( "identity", IdentityGenerator.class );
        register( "select", SelectGenerator.class );
        register( "sequence", SequenceStyleGenerator.class );
        register( "seqhilo", SequenceHiLoGenerator.class );
        register( "increment", IncrementGenerator.class );
        register( "foreign", ForeignGenerator.class );
        register( "sequence-identity", SequenceIdentityGenerator.class );
        register( "enhanced-sequence", SequenceStyleGenerator.class );
        register( "enhanced-table", TableGenerator.class );
    }

对几种比较常用的类型进行说明:

@Id
@GeneratedValue(generator = "faceset_generator")
@GenericGenerator(name = "faceset_generator", strategy = "uuid")
@Id
@GeneratedValue(generator = "faceset_generator")
@GenericGenerator(name = "faceset_generator", strategy = "assigned")
@Id
@GeneratedValue(generator = "faceset_generator")  
@GenericGenerator(name = "faceset_generator", strategy = "sequence",    parameters = { @Parameter(name = "sequence", value = "faceset_seq") }) 

来自SpringDataJpa-主键生成策略

4.自定义主键生成策略

package com.dancer4code.actuator.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;
import java.io.Serializable;

/**
 * Created with IntelliJ IDEA.
 * User: liangqing.zhao(zlq)
 * Date: 2019/10/4 17:14
 * Description:
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "student")

public class Student implements Serializable{
    @Id
    @GenericGenerator(name = "my_id", strategy = "com.dancer4code.actuator.utils.MyIdGenerator" )
    @GeneratedValue(generator = "my_id")
    private String id;
    private String name;
    private Integer age;
}

MyIdGenerator.java

package com.dancer4code.actuator.utils;

import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentifierGenerator;

import java.io.Serializable;
import java.util.UUID;

/**
 * Created with IntelliJ IDEA.
 * User: liangqing.zhao(zlq)
 * Date: 2019/10/4 19:01
 * Description:
 */
public class MyIdGenerator implements IdentifierGenerator {
    @Override
    public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
        return "d4c-"+UUID.randomUUID();
    }
}

成功实现自己的id生成

result

源码见gitee中spring-boot-lab

如果还不够用请参考雪花算法
更多其他内容请参考分布式全局唯一ID生成策略

上一篇 下一篇

猜你喜欢

热点阅读