国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Spring Data JDBC - 如何使用自定義ID

「Spring」認證安全架構 ? 來源:「Spring」認證安全架構 ? 作者:「Spring」認證安全 ? 2022-06-28 16:18 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

原標題:Spring認證|Spring Data JDBC-如何使用自定義ID生成

這是關于如何解決使用 Spring Data JDBC 時可能遇到的各種挑戰的系列文章的第一篇。

如果你不了解 Spring Data JDBC,你應該首先閱讀它的介紹和文章,它解釋了 Spring Data JDBC 上下文中的相關性。相信我,這很重要。

文章基于我在 2021 年春季一期上這篇文章的部分演講。

使用 ID - 特別是當您想要控制實體的 ID 并且不會選擇什么數據庫時,您的選擇是什么。

假設情況下,類型數據列JDBC假設的ID通過生成SERIAL或AUTOINCREMENT得到。 ,聚合根執行插入操作。數據庫生成一個ID,這個ID由Spring Data JDBC在聚合根中設置。

考慮一個由單個簡單的類組成的簡單聚合:

類小黃人{

@ID

長ID;

字符串名稱;

Minion(字符串名稱){

this.name = 名稱;

}

}

進一步考慮默認CrudRepository。

接口 MinionRepository 擴展 CrudRepository {

}

存儲庫會自動連接到您的代碼中,如下所示:

@自動連線

MinionRepository 隨從;

以下工作正常:

Minion before = new Minion("Bob");

assertThat(before.id).isNull();

Minion after = minions.save(before);

assertThat(after.id).isNotNull();

但是下一點點:

Minion before = new Minion("Stuart");

before.id = 42L;

minions.save(before);

更新語句,Spring Data JDBC 嘗試執行更新,因為 ID 已經設置。但是,因為實際上是新的,更新語句影響零行 Spring Data JDBC 拋出異常。

有幾種方法可以解決這個問題。我已經找到了你不同的解決方法,并且已經找到了我認為最簡單的方法,因此可以找到適合的方法,你就可以停止閱讀。之后回來閱讀其他選項并提高您的 Spring Data 技能。

版本

將版本屬性添加到您的聚合屬性。“版本屬性”是指用@Version。此類的主要目的是可以樂觀鎖定。但是,作為屬性,Spring Data JDBC 使用版本屬性來確定聚合根是否是新的。 只要版本是null 或0 原始類型,聚合就被認為是新的,即使id設置了。

使用這種方法,您必須更改實體和(當然)系統,但別無其他。

此外,對于許多應用程序來說,樂觀的最初是很多。

我們把原來的Minion變成了一個VersionedMinion:

類 VersionedMinion {

@Id 長 ID;

字符串名稱;

@Version 整數版本;

VersionedMinion(長ID,字符串名稱){

this.id = id;

this.name = 名稱;

}

}

通過此更改,以下構造有效:

VersionedMinion before = new VersionedMinion(23L, "Bob");

assertThat(before.id).isNotNull();

versionedMinions.save(before);

VersionedMinion 重新加載 = versionedMinions.findById(before.id).get();

assertThat(reloaded.name).isEqualTo("Bob");

樣板

一種讓您的遺贈附帶 ID 的方法是自己另外插入物。您可以通過注入 JdbcAggregateTemplate 并調用 JdbcAggregateTemplate.insert(T)。這JdbAggregateTemplate是存儲庫下面的底層,因此您使用存儲庫用于插入的相同代碼,但您決定何時使用插入:

Minion before = new Minion("Stuart");

before.id = 42L;

模板.插入(之前);

Minion reloaded = minions.findById(42L).get();

assertThat(reloaded.name).isEqualTo("Stuart");

請注意,我們不使用存儲庫農場使用模板,其中注入了以下內容:

@自動連線

JdbcAggregateTemplate 模板;

事件監聽器

模板方法非常適用于您已經知道 ID 的情況 - 例如,當您從另一個系統導入數據并且您想要重用該系統的 ID 時。

如果您不知道 ID 并且不想在您的業務代碼中包含任何 ID 相關的內容,那么使用 ID 可能是更好的選擇。

我們的目的正確的目的是在某些生命周期事件期間被調用的豆子。它返回修改潛在的聚合根,因此它也適用于不形成實體類。

在目標中,我們確定有問題的聚合根是否需要新 ID。 如果是這樣,我們將使用我們選擇的算法生成它。

我們使用另一種變體 Minion

類 StringIdMinion {

@ID

字符串標識;

字符串名稱;

StringIdMinion(字符串名稱){

this.name = 名稱;

}

}

但是,我們在配置中注冊了一個驚人的例子:

@豆角,扁豆

BeforeSaveCallback beforeSaveCallback() {

返回(minion,mutableAggregateChange)-> {

如果(minion.id == null){

minion.id = UUID.randomUUID().toString();

}

返回仆從;

};

}

保存實體的代碼現在看起來就像是由數據庫生成的:

StringIdMinion before = new StringIdMinion("Kevin");

stringions.save(before);

assertThat(before.id).isNotNull();

StringIdMinion reloaded = stringions.findById(before.id).get();

assertThat(reloaded.name).isEqualTo("Kevin");

持久的

一個選項是讓化根控制是否應該更新或插入。你可以實現持久化的方法(尤其是實現是新的)來實現這一點。您也想使用聚合根進行更新時,這會抓住。在這種情況下,您需要提出更靈活的策略。

我們需要 Minion 再次調整我們的:

類 PersistableMinion 實現 Persistable {

@Id 長 ID;

字符串名稱;

PersistableMinion(長ID,字符串名稱){

this.id = id;

this.name = 名稱;

}

@覆蓋

公共長 getId() {

返回標識;

}

@覆蓋

公共布爾 isNew() {

// 這個實現肯定不適合生產使用

返回真;

}

}

保存一個的代碼 PersistableMinion 看起來是一樣的:

PersistableMinion before = new PersistableMinion(23L, "Dave");

persistableMinions.save(before);

PersistableMinion 重新加載 = persistableMinions.findById(before.id).get();

assertThat(reloaded.name).isEqualTo("Dave");

結論

Spring Data JDBC 提供了大量關于如何控制聚合 ID 的選項。雖然我在示例中使用了非常嚴重的邏輯,但基本沒有什么能阻止您實現您所考慮的任何邏輯,因為它們都歸結為 Java 代碼。

完整的示例代碼可在Spring中國教育管理中心(Spring認證)數據示例庫訪問!

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • spring
    +關注

    關注

    0

    文章

    341

    瀏覽量

    15935
  • JDBC
    +關注

    關注

    0

    文章

    25

    瀏覽量

    13853
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    如何為 Vision Five 2 編譯自定義 Linux 內核?

    Vision Five 2 的 Debian 用戶指南只提供了半頁關于如何編譯自己的內核的相當稀疏的內容。僅從該文檔中,我無法制作我的自定義內核。那里的信息似乎相當不完整。如果有人能提供一些
    發表于 02-24 07:44

    電能質量監測裝置可自定義監測時段嗎?

    電能質量監測裝置普遍支持自定義監測時段,現代中高端裝置還具備分時差異化監測與靈活觸發能力,可按時間、事件或混合策略定制采集與存儲,兼顧精度、效率與存儲成本。 一、自定義監測時段的核心實現方式 1.
    的頭像 發表于 12-10 16:49 ?1071次閱讀

    電能質量在線監測裝置的自定義監測時段功能有哪些應用場景?

    電能質量在線監測裝置的 自定義監測時段功能 ,核心價值是通過 “按需配置監測時間、采樣頻率和數據策略”,實現精準監測、資源優化與數據針對性分析,其應用場景覆蓋工業生產、商業運營、電網運維、特殊保障等
    的頭像 發表于 12-10 14:01 ?404次閱讀
    電能質量在線監測裝置的<b class='flag-5'>自定義</b>監測時段功能有哪些應用場景?

    電能質量在線監測裝置可自定義監測時段嗎?

    電能質量在線監測裝置 完全支持自定義監測時段 ,并提供 精細化、差異化 的配置能力。核心通過 嵌入式任務調度系統 結合 本地 / 遠程參數配置 實現,可靈活設定監測開始 / 結束時間、采樣頻率、數據
    的頭像 發表于 12-10 13:58 ?360次閱讀
    電能質量在線監測裝置可<b class='flag-5'>自定義</b>監測時段嗎?

    無圖形界面模式下自定義檢查工具的應用

    此前文章已介紹 ANSA 中的自定義檢查工具。本文將探討該功能在無圖形界面(No-GUI)模式下的應用,旨在滿足標準化工作流程的需求,適用于需要高度自動化的前處理場景。通過集成自定義檢查,用戶可實現工作流程的高效自動化運行。
    的頭像 發表于 11-30 14:13 ?581次閱讀
    無圖形界面模式下<b class='flag-5'>自定義</b>檢查工具的應用

    采用匯編指示符來使用自定義指令

    具體實現 1、采用.word .half .dword等匯編指示符直接插入自定義指令,這種方法需要自己指定寄存器。其中.word為插入一個字的數據即32位,.half為插入半字即16位
    發表于 10-28 06:02

    強實時運動控制內核MotionRT750(九):內置C語言的自定義機械手模型實現

    內置C語言的自定義機械手模型實現。
    的頭像 發表于 10-27 14:14 ?849次閱讀
    強實時運動控制內核MotionRT750(九):內置C語言的<b class='flag-5'>自定義</b>機械手模型實現

    如何使用SDK進行自定義音頻播放功能

    在上一篇文章安信可離線語音模組 VC-01、VC-02 系列教程 【二次開發篇】自定義音頻替換失敗過程中,簡要概述了res_build_tool.py 文件, 其主要的作用就是將音頻文件進行轉換,從而使編譯固件的時候能夠將音頻文件編譯到BIN中,然后在各項事件觸發的時候實現播放。
    的頭像 發表于 09-25 15:52 ?3698次閱讀
    如何使用SDK進行<b class='flag-5'>自定義</b>音頻播放功能

    LOTO示波器自定義解碼功能—CANFD解碼

    /?spm_id_from=333.1365.list.card_archive.click 。 視頻中僅對串口進行解碼演示,正好我們從客戶手中拿到了一塊USB轉CAN/CANFD模塊,如下圖所示, 本文借此對自定義解碼功能
    的頭像 發表于 07-11 10:34 ?1050次閱讀
    LOTO示波器<b class='flag-5'>自定義</b>解碼功能—CANFD解碼

    大彩講堂:VisualTFT軟件如何自定義圓形進度條

    VisualTFT軟件如何自定義圓形進度條
    的頭像 發表于 07-07 17:10 ?1629次閱讀
    大彩講堂:VisualTFT軟件如何<b class='flag-5'>自定義</b>圓形進度條

    KiCad 中的自定義規則(KiCon 演講)

    “ ?Seth Hillbrand 在 KiCon US 2025 上為大家介紹了 KiCad 的規則系統,并詳細講解了自定義規則的設計與實例。? ” ? 演講主要圍繞 加強 KiCad 中的自定義
    的頭像 發表于 06-16 11:17 ?2125次閱讀
    KiCad 中的<b class='flag-5'>自定義</b>規則(KiCon 演講)

    HarmonyOS應用自定義鍵盤解決方案

    自定義鍵盤是一種替換系統默認鍵盤的解決方案,可實現鍵盤個性化交互。允許用戶結合業務需求與操作習慣,對按鍵布局進行可視化重構、設置多功能組合鍵位,使輸入更加便捷和舒適。在安全防護層面,自定義鍵盤可以
    的頭像 發表于 06-05 14:19 ?2396次閱讀

    如何使用自定義設置回調函數?

    你好,我正在嘗試編寫自己的自定義設置回調函數,并使用 fastEnum=false。 是否有任何代碼示例或資料可供我參考? void CyU3PUsbRegisterSetupCallback
    發表于 05-21 06:11

    LabVIEW運動控制(三):EtherCAT運動控制器的高效加工指令自定義封裝

    LabVIEW高效加工指令自定義封裝
    的頭像 發表于 04-08 13:49 ?3628次閱讀
    LabVIEW運動控制(三):EtherCAT運動控制器的高效加工指令<b class='flag-5'>自定義</b>封裝

    如何添加自定義單板

    在開發過程中,用戶有時需要創建自定義板配置。本節將通過一個實例講解用戶如何創建屬于自己的machine,下面以g2l-test.conf為例進行說明。
    的頭像 發表于 03-12 14:43 ?1349次閱讀