最近學習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 }
從源碼中能夠看出JPA提供的四種標準主鍵策略TABLE,SEQUENCE,IDENTITY,AUTOjava
TABLE:使用一個特定的數據庫表格來保存主鍵。mysql
SEQUENCE:根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列。 這個值要與generator一塊兒使用,generator 指定生成主鍵使用的生成器(多是orcale中本身編寫的序列)。spring
IDENTITY:主鍵由數據庫自動生成(主要是支持自動增加的數據庫,如mysql)sql
AUTO:主鍵由程序控制,也是GenerationType的默認值。數據庫
不寫GeneratedValue註解時即爲GenerationType.AUTO 這時主鍵生成是根據數據庫hibernate_sequence裏的next_val來生成但我想用自已規則來生成本身的ID查了半天的資料終於解決這個問題。session
自定義生成的ID,看到效果出來那個興奮啊,新手對java的一堆註解仍是真的不容易上手。app
下面是具體代碼ide
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