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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM