91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

「Spring」認(rèn)證安全架構(gòu) ? 來(lái)源:「Spring」認(rèn)證安全架構(gòu) ? 作者:「Spring」認(rèn)證安全 ? 2022-06-28 16:18 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

原標(biāo)題:Spring認(rèn)證|Spring Data JDBC-如何使用自定義ID生成

這是關(guān)于如何解決使用 Spring Data JDBC 時(shí)可能遇到的各種挑戰(zhàn)的系列文章的第一篇。

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

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

使用 ID - 特別是當(dāng)您想要控制實(shí)體的 ID 并且不會(huì)選擇什么數(shù)據(jù)庫(kù)時(shí),您的選擇是什么。

假設(shè)情況下,類(lèi)型數(shù)據(jù)列JDBC假設(shè)的ID通過(guò)生成SERIAL或AUTOINCREMENT得到。 ,聚合根執(zhí)行插入操作。數(shù)據(jù)庫(kù)生成一個(gè)ID,這個(gè)ID由Spring Data JDBC在聚合根中設(shè)置。

考慮一個(gè)由單個(gè)簡(jiǎn)單的類(lèi)組成的簡(jiǎn)單聚合:

類(lèi)小黃人{(lán)

@ID

長(zhǎng)ID;

字符串名稱(chēng);

Minion(字符串名稱(chēng)){

this.name = 名稱(chēng);

}

}

進(jìn)一步考慮默認(rèn)CrudRepository。

接口 MinionRepository 擴(kuò)展 CrudRepository {

}

存儲(chǔ)庫(kù)會(huì)自動(dòng)連接到您的代碼中,如下所示:

@自動(dòng)連線(xiàn)

MinionRepository 隨從;

以下工作正常:

Minion before = new Minion("Bob");

assertThat(before.id).isNull();

Minion after = minions.save(before);

assertThat(after.id).isNotNull();

但是下一點(diǎn)點(diǎn):

Minion before = new Minion("Stuart");

before.id = 42L;

minions.save(before);

更新語(yǔ)句,Spring Data JDBC 嘗試執(zhí)行更新,因?yàn)?ID 已經(jīng)設(shè)置。但是,因?yàn)閷?shí)際上是新的,更新語(yǔ)句影響零行 Spring Data JDBC 拋出異常。

有幾種方法可以解決這個(gè)問(wèn)題。我已經(jīng)找到了你不同的解決方法,并且已經(jīng)找到了我認(rèn)為最簡(jiǎn)單的方法,因此可以找到適合的方法,你就可以停止閱讀。之后回來(lái)閱讀其他選項(xiàng)并提高您的 Spring Data 技能。

版本

將版本屬性添加到您的聚合屬性?!鞍姹緦傩浴笔侵赣聾Version。此類(lèi)的主要目的是可以樂(lè)觀(guān)鎖定。但是,作為屬性,Spring Data JDBC 使用版本屬性來(lái)確定聚合根是否是新的。 只要版本是null 或0 原始類(lèi)型,聚合就被認(rèn)為是新的,即使id設(shè)置了。

使用這種方法,您必須更改實(shí)體和(當(dāng)然)系統(tǒng),但別無(wú)其他。

此外,對(duì)于許多應(yīng)用程序來(lái)說(shuō),樂(lè)觀(guān)的最初是很多。

我們把原來(lái)的Minion變成了一個(gè)VersionedMinion:

類(lèi) VersionedMinion {

@Id 長(zhǎng) ID;

字符串名稱(chēng);

@Version 整數(shù)版本;

VersionedMinion(長(zhǎng)ID,字符串名稱(chēng)){

this.id = id;

this.name = 名稱(chēng);

}

}

通過(guò)此更改,以下構(gòu)造有效:

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

assertThat(before.id).isNotNull();

versionedMinions.save(before);

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

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

樣板

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

Minion before = new Minion("Stuart");

before.id = 42L;

模板.插入(之前);

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

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

請(qǐng)注意,我們不使用存儲(chǔ)庫(kù)農(nóng)場(chǎng)使用模板,其中注入了以下內(nèi)容:

@自動(dòng)連線(xiàn)

JdbcAggregateTemplate 模板;

事件監(jiān)聽(tīng)器

模板方法非常適用于您已經(jīng)知道 ID 的情況 - 例如,當(dāng)您從另一個(gè)系統(tǒng)導(dǎo)入數(shù)據(jù)并且您想要重用該系統(tǒng)的 ID 時(shí)。

如果您不知道 ID 并且不想在您的業(yè)務(wù)代碼中包含任何 ID 相關(guān)的內(nèi)容,那么使用 ID 可能是更好的選擇。

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

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

我們使用另一種變體 Minion

類(lèi) StringIdMinion {

@ID

字符串標(biāo)識(shí);

字符串名稱(chēng);

StringIdMinion(字符串名稱(chēng)){

this.name = 名稱(chēng);

}

}

但是,我們?cè)谂渲弥凶?cè)了一個(gè)驚人的例子:

@豆角,扁豆

BeforeSaveCallback beforeSaveCallback() {

返回(minion,mutableAggregateChange)-> {

如果(minion.id == null){

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

}

返回仆從;

};

}

保存實(shí)體的代碼現(xiàn)在看起來(lái)就像是由數(shù)據(jù)庫(kù)生成的:

StringIdMinion before = new StringIdMinion("Kevin");

stringions.save(before);

assertThat(before.id).isNotNull();

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

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

持久的

一個(gè)選項(xiàng)是讓化根控制是否應(yīng)該更新或插入。你可以實(shí)現(xiàn)持久化的方法(尤其是實(shí)現(xiàn)是新的)來(lái)實(shí)現(xiàn)這一點(diǎn)。您也想使用聚合根進(jìn)行更新時(shí),這會(huì)抓住。在這種情況下,您需要提出更靈活的策略。

我們需要 Minion 再次調(diào)整我們的:

類(lèi) PersistableMinion 實(shí)現(xiàn) Persistable {

@Id 長(zhǎng) ID;

字符串名稱(chēng);

PersistableMinion(長(zhǎng)ID,字符串名稱(chēng)){

this.id = id;

this.name = 名稱(chēng);

}

@覆蓋

公共長(zhǎng) getId() {

返回標(biāo)識(shí);

}

@覆蓋

公共布爾 isNew() {

// 這個(gè)實(shí)現(xiàn)肯定不適合生產(chǎn)使用

返回真;

}

}

保存一個(gè)的代碼 PersistableMinion 看起來(lái)是一樣的:

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

persistableMinions.save(before);

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

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

結(jié)論

Spring Data JDBC 提供了大量關(guān)于如何控制聚合 ID 的選項(xiàng)。雖然我在示例中使用了非常嚴(yán)重的邏輯,但基本沒(méi)有什么能阻止您實(shí)現(xiàn)您所考慮的任何邏輯,因?yàn)樗鼈兌細(xì)w結(jié)為 Java 代碼。

完整的示例代碼可在Spring中國(guó)教育管理中心(Spring認(rèn)證)數(shù)據(jù)示例庫(kù)訪(fǎng)問(wèn)!

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    341

    瀏覽量

    15940
  • JDBC
    +關(guān)注

    關(guān)注

    0

    文章

    25

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何為 Vision Five 2 編譯自定義 Linux 內(nèi)核?

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

    電能質(zhì)量監(jiān)測(cè)裝置可自定義監(jiān)測(cè)時(shí)段嗎?

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

    電能質(zhì)量在線(xiàn)監(jiān)測(cè)裝置的自定義監(jiān)測(cè)時(shí)段功能有哪些應(yīng)用場(chǎng)景?

    電能質(zhì)量在線(xiàn)監(jiān)測(cè)裝置的 自定義監(jiān)測(cè)時(shí)段功能 ,核心價(jià)值是通過(guò) “按需配置監(jiān)測(cè)時(shí)間、采樣頻率和數(shù)據(jù)策略”,實(shí)現(xiàn)精準(zhǔn)監(jiān)測(cè)、資源優(yōu)化與數(shù)據(jù)針對(duì)性分析,其應(yīng)用場(chǎng)景覆蓋工業(yè)生產(chǎn)、商業(yè)運(yùn)營(yíng)、電網(wǎng)運(yùn)維、特殊保障等
    的頭像 發(fā)表于 12-10 14:01 ?411次閱讀
    電能質(zhì)量在線(xiàn)監(jiān)測(cè)裝置的<b class='flag-5'>自定義</b>監(jiān)測(cè)時(shí)段功能有哪些應(yīng)用場(chǎng)景?

    電能質(zhì)量在線(xiàn)監(jiān)測(cè)裝置可自定義監(jiān)測(cè)時(shí)段嗎?

    電能質(zhì)量在線(xiàn)監(jiān)測(cè)裝置 完全支持自定義監(jiān)測(cè)時(shí)段 ,并提供 精細(xì)化、差異化 的配置能力。核心通過(guò) 嵌入式任務(wù)調(diào)度系統(tǒng) 結(jié)合 本地 / 遠(yuǎn)程參數(shù)配置 實(shí)現(xiàn),可靈活設(shè)定監(jiān)測(cè)開(kāi)始 / 結(jié)束時(shí)間、采樣頻率、數(shù)據(jù)
    的頭像 發(fā)表于 12-10 13:58 ?364次閱讀
    電能質(zhì)量在線(xiàn)監(jiān)測(cè)裝置可<b class='flag-5'>自定義</b>監(jiān)測(cè)時(shí)段嗎?

    無(wú)圖形界面模式下自定義檢查工具的應(yīng)用

    此前文章已介紹 ANSA 中的自定義檢查工具。本文將探討該功能在無(wú)圖形界面(No-GUI)模式下的應(yīng)用,旨在滿(mǎn)足標(biāo)準(zhǔn)化工作流程的需求,適用于需要高度自動(dòng)化的前處理場(chǎng)景。通過(guò)集成自定義檢查,用戶(hù)可實(shí)現(xiàn)工作流程的高效自動(dòng)化運(yùn)行。
    的頭像 發(fā)表于 11-30 14:13 ?589次閱讀
    無(wú)圖形界面模式下<b class='flag-5'>自定義</b>檢查工具的應(yīng)用

    采用匯編指示符來(lái)使用自定義指令

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

    強(qiáng)實(shí)時(shí)運(yùn)動(dòng)控制內(nèi)核MotionRT750(九):內(nèi)置C語(yǔ)言的自定義機(jī)械手模型實(shí)現(xiàn)

    內(nèi)置C語(yǔ)言的自定義機(jī)械手模型實(shí)現(xiàn)。
    的頭像 發(fā)表于 10-27 14:14 ?856次閱讀
    強(qiáng)實(shí)時(shí)運(yùn)動(dòng)控制內(nèi)核MotionRT750(九):內(nèi)置C語(yǔ)言的<b class='flag-5'>自定義</b>機(jī)械手模型實(shí)現(xiàn)

    如何使用SDK進(jìn)行自定義音頻播放功能

    在上一篇文章安信可離線(xiàn)語(yǔ)音模組 VC-01、VC-02 系列教程 【二次開(kāi)發(fā)篇】自定義音頻替換失敗過(guò)程中,簡(jiǎn)要概述了res_build_tool.py 文件, 其主要的作用就是將音頻文件進(jìn)行轉(zhuǎn)換,從而使編譯固件的時(shí)候能夠?qū)⒁纛l文件編譯到BIN中,然后在各項(xiàng)事件觸發(fā)的時(shí)候?qū)崿F(xiàn)播放。
    的頭像 發(fā)表于 09-25 15:52 ?3738次閱讀
    如何使用SDK進(jìn)行<b class='flag-5'>自定義</b>音頻播放功能

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

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

    大彩講堂:VisualTFT軟件如何自定義圓形進(jìn)度條

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

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

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

    HarmonyOS應(yīng)用自定義鍵盤(pán)解決方案

    自定義鍵盤(pán)是一種替換系統(tǒng)默認(rèn)鍵盤(pán)的解決方案,可實(shí)現(xiàn)鍵盤(pán)個(gè)性化交互。允許用戶(hù)結(jié)合業(yè)務(wù)需求與操作習(xí)慣,對(duì)按鍵布局進(jìn)行可視化重構(gòu)、設(shè)置多功能組合鍵位,使輸入更加便捷和舒適。在安全防護(hù)層面,自定義鍵盤(pán)可以
    的頭像 發(fā)表于 06-05 14:19 ?2404次閱讀

    如何使用自定義設(shè)置回調(diào)函數(shù)?

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

    LabVIEW運(yùn)動(dòng)控制(三):EtherCAT運(yùn)動(dòng)控制器的高效加工指令自定義封裝

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

    如何添加自定義單板

    在開(kāi)發(fā)過(guò)程中,用戶(hù)有時(shí)需要?jiǎng)?chuàng)建自定義板配置。本節(jié)將通過(guò)一個(gè)實(shí)例講解用戶(hù)如何創(chuàng)建屬于自己的machine,下面以g2l-test.conf為例進(jìn)行說(shuō)明。
    的頭像 發(fā)表于 03-12 14:43 ?1358次閱讀