自定義JPA主鍵生成策略實(shí)現(xiàn)保存時(shí)允許自定義ID

適合場(chǎng)景

在使用Spring Data JPA的時(shí)候,在使用UUID作為主鍵的時(shí)候,通常都會(huì)使用system-uuid作為主鍵生成策略,類似配置如下:

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid2")
private String id;

我們都知道,使用save方法保存實(shí)體的時(shí)候JAP會(huì)根據(jù)主鍵判斷是新增(主鍵為空或者數(shù)據(jù)庫表中無該主鍵)還是更新(數(shù)據(jù)庫表中有該主鍵)。

而且,在使用這種如上配置的時(shí)候無論實(shí)體的主鍵是否為空,只要在表中不存在,都會(huì)再次生成主鍵,也就是沒辦法通過給id屬性賦值的形式來自定義實(shí)體的id。

而在一些場(chǎng)景下,會(huì)有自定義主鍵的需求,比如主鍵來源于其他第三方系統(tǒng),這時(shí)候我們期望的還是使用第三方系統(tǒng)的主鍵作為主鍵以表示同一條數(shù)據(jù),這就需要我們能夠?qū)崿F(xiàn)自定義主鍵生成策略,并且JPA也提供了這樣的通道。

自定義主鍵生成策略

Spring Data JPA可以通過實(shí)現(xiàn)org.hibernate.id.IdentifierGenerator接口來自定義主鍵生成器,而同時(shí)也提供了許多的內(nèi)置生成器,就如上文中的system-uuid生成器,使用uuid2生成策略實(shí)現(xiàn)主鍵生成,也有實(shí)現(xiàn)自增的主鍵生成器:IncrementGenerator

根據(jù)需求,可以通過繼承org.hibernate.id.UUIDGenerator生成器來實(shí)現(xiàn)自定義ID:

/**
 * 自定義UUID生成器
 * @author sevenlin
 */
public class CustomUUIDGenerator extends UUIDGenerator {
    @Override
    public Serializable generate(SessionImplementor session, Object object) throws HibernateException {
        Object id = FieldUtil.readField(object, "id");
        if (id != null) {
            return (Serializable) id;
        }
        return super.generate(session, object);
    }
}

有了自定義主鍵生成器之后就可以通過如下配置指定該生成器:

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "custom-uuid")
@GenericGenerator(name = "custom-uuid", strategy = "com.sevenlin.dal.CustomUUIDGenerator")
private String            id;

這樣,就可以實(shí)現(xiàn)自定義ID,同時(shí)保留原來的主鍵生成策略不變。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,659評(píng)論 19 139
  • class 可配置項(xiàng) native:根據(jù)使用的數(shù)據(jù)庫幫你選擇哪個(gè)值 uuid:類似C#Guid 1、assigne...
    垃圾簡書_吃棗藥丸閱讀 566評(píng)論 0 2
  • 2017年8月21日 我原本只想簡單記錄一下springboot中應(yīng)用Jpa的簡單操作。不想由于hibernate...
    行者N閱讀 6,736評(píng)論 0 23
  • 幾天沒寫東西,真有點(diǎn)手癢!好,來說說7號(hào)吧,你可能會(huì)問“今天10號(hào)了,為什么說7號(hào)的事?”嘻嘻,7號(hào)是包包外公生日...
    瑩影相隨閱讀 376評(píng)論 0 2
  • 玫瑰園薈萃2018第四十七期 本期主題作業(yè):窗外(體裁不限,題目可自擬) 本期作業(yè)主持人:云中飄舞 窗外,可以是荒...
    玫瑰園編輯閱讀 347評(píng)論 0 7

友情鏈接更多精彩內(nèi)容