MyBatis-Plus MetaObjectHandler的幾個坑(主要是id字段)

1.背景

主要是要實現一個id字段的自增長,不依賴數據庫的能力(已避免后續換庫的問題)。姑且使用redis作為表的id分配器,因此使用MyBatis-Plus MetaObjectHandler對每個insert的id進行分配。

2.實施過程

以下是實現過程
1.實現MetaObjectHandler,重寫insertFill,設置id
2.Configuration中實例化MetaObjectHandler

public class MybatisPlusMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {Long id = getIdFromRedis(); //redis取idthis.setFieldValByName("id", id, metaObject); //給id字段設置取得的主鍵值}@Overridepublic void updateFill(MetaObject metaObject) {//其他操作}
}
//Configuration中獲取MetaObjectHandler 
@Configuration(proxyBeanMethods = false)
public class MybatisAutoConfiguration implements WebMvcConfigurer {@Beanpublic MybatisPlusMetaObjectHandler mybatisPlusMetaObjectHandler() {return new MybatisPlusMetaObjectHandler();}
}

3.使用mybatis-plus的mapper內的save或者saveBatch方法
*4.需要注意的是對應實體類需要加上insert fill注解

@Data
@TableName("TEST")
public class Test {@TableField(fill= FieldFill.INSERT)private Long id;private String fieldTest;
}

3.出現的問題

按上述方式實現后出現沒有進入
insertFill的情況,
后來發現實體類只在id字段上加@TableField(fill= FieldFill.INSERT)是不會進insertFill的
因此嘗試

@Data
@TableName("TEST")
public class Test {@TableField(fill= FieldFill.INSERT)private Long id;@TableField(fill= FieldFill.INSERT) private String fieldTest;
}

在另一個字段上加上@TableField(fill= FieldFill.INSERT)
然后成功進入了insertFill,也對id進行了賦值,但是最后生成的sql
居然沒有id字段
居然沒有id字段
居然沒有id字段
是的,明明都已經走了對id的賦值,但生產的sql就是沒有id字段賦值

4.最終解決

@Data
@TableName("TEST")
public class Test {@TableId(type = IdType.INPUT)@TableField(fill= FieldFill.INSERT)private Long id;@TableField(fill= FieldFill.INSERT) private String fieldTest;
}

最后是在id上加上@TableId(type = IdType.INPUT)使id字段的type是input,才成功實現了id從redis取這個功能

5.反思

然后我又嘗試了以下代碼

@Data
@TableName("TEST")
public class Test {@TableId(type = IdType.INPUT)@TableField(fill= FieldFill.INSERT)private Long id;//@TableField(fill= FieldFill.INSERT) private String fieldTest;
}

把其他字段上的@TableField(fill= FieldFill.INSERT) 去了 。。。然后又不會進入insertFill了
目測mybatis-plus源碼的判斷是,先判斷是否存在非id字段需要走@TableField(fill= FieldFill.INSERT),才會進入insertFill,
然后判斷設置填充的字段是否是id,且id有沒有配置自定義Input

6.結論

本質上是id字段是mybatis-plus中的保留字段,一般需要配置@TableId,然后@TableId和@TableField(fill= FieldFill.INSERT)存在沖突。沒有去看源碼,但大概現象如此。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93864.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93864.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93864.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Springboot 項目配置多數據源

Springboot 項目配置多數據源 基礎環境 java8、springboot2.2.13、mybatis、mysql5.x、oracle 項目配置 1.application.yml spring:datasource:mysql1:username: abcpassword: 123456url: jdbc:mysql://127.0.0.1:3306/panda?useUnicodetrue&characterEncodingUTF-8&z…

STM32_0001 KEILMDK V5.36 編譯一個STM32F103C8T6說core_cm3.h文件找不到以及編譯器版本不匹配的解決辦法

KEILMDK V5.36 編譯一個STM32F103C8T6說core_cm3.h文件找不到的解決辦法利用KEILMDK V5.36 編譯一個STM32F103C8T6說core_cm3.h文件找不到。主要錯誤信息如下D:/stm32studio/Armmdk/Packs/Keil/STM32F1xx_DFP/2.4.1/Device/Include\stm32f10x.h(486): error: core_cm3.h file n…

基于Transformer的機器翻譯——訓練篇

前言 還在為機器翻譯模型從理論到落地卡殼?系列博客第三彈——模型訓練篇強勢登場,手把手帶你走完Transformer中日翻譯項目的最后關鍵一步! 前兩期我們搞定了數據預處理(分詞、詞表構建全流程)和模型搭建&#xff08…

智能編程中的智能體與 AI 應用:概念、架構與實踐場景

一、智能體(Intelligent Agent)在編程中的定義與架構1. 智能體的核心概念 智能體是指在特定環境中能夠自主感知、決策并執行動作的軟件實體,具備以下特征:自主性:無需人工干預即可根據環境變化調整行為。交互性&#x…

數組實現各類數據結構

目錄 一、數組實現單鏈表 二、數組實現雙鏈表 三、數組實現棧 四、數組模擬隊列 五、數組模擬單調棧 六、數組模擬單調隊列&#xff08;滑動窗口&#xff09; 七、數組模擬堆 一、數組實現單鏈表 #include<iostream> #include<algorithm> #include<cstr…

數據處理與統計分析 —— apply自定義函數

目錄 一、向量化與偽向量化 1、向量化 2、np.vectorize 偽向量化&#xff08;特定場景&#xff09; 3、apply&#xff08;自定義函數&#xff09; 二、apply函數 1、對series中使用apply 2、對dataframe中使用apply 3、apply函數案例-泰坦尼克號數據集] 數據集下載鏈接&#xf…

如何有效利用大語言模型來智能加速產業聯盟的產業鏈轉化路徑?

觀點作者&#xff1a;科易網AI技術轉移研究院在科技創新浪潮席卷全球的今天&#xff0c;科技成果轉化已成為衡量一個國家創新能力的重要標志。然而&#xff0c;一項權威調查顯示&#xff0c;我國科技成果轉化率不足30%&#xff0c;大量有價值的創新成果仍停留在實驗室階段&…

視頻加水印 視頻加水印軟件 視頻加動態水印

如果你有一個視頻&#xff0c;你想給他加一個水印&#xff0c;那么你可以使用這個工具&#xff0c;準備好你的視頻和水印。水印一般采用PNG&#xff0c;打開這個工具&#xff0c;把你的視頻和水印拖進這個方框當中。視頻限制是MP4&#xff0c;水印限制是PNG&#xff0c;它可以把…

面向DeepSeek chat coding實錄(二)

向DeepSeek的提問 幫我設計以下兩個python class Span 屬性&#xff1a; hash值&#xff08;在init函數中通過時間初始化&#xff09; 創建時間&#xff1a;時間&#xff08;在init函數中通過時間初始化&#xff09; 結束時間&#xff1a;時間&#xff08;可選&#xff0c;默認…

Hi3516CV610-00S 海思SOC芯片 可申請開發資料

1.1 概述Hi3516CV610 是一顆應用在安防市場的 IPC SoC。在開放操作系統、新一代視頻編解碼標準、網絡安全和隱私保護、人工智能方面引領行業發展&#xff0c;主要面向室內外場景下的槍機、球機、半球機、海螺機、槍球一體機、雙目長短焦機等產品形態&#xff0c;打造極具競爭力…

算法題Day4

目錄 13. 練習13 : 整數十位 14. 練習14 : 時間轉換 15. 練習15 : 小雨的游泳時間 13. 練習13 : 整數十位 解題方法: #include <iostream> using namespace std; int a; int main() {cin >> a;cout << a % 100 / 10 << endl;return 0; } 14. 練習…

加速你的故障排查:使用 Elasticsearch 構建家電手冊的 RAG 應用

作者&#xff1a;來自 Elastic Alessandro Brofferio 學習如何使用 Elasticsearch 構建 RAG 應用&#xff0c;輕松排查你的家電問題。 想要獲得 Elastic 認證嗎&#xff1f;來看看下一次 Elasticsearch 工程師培訓什么時候開始吧&#xff01; Elasticsearch 擁有大量新功能&am…

6.Shell腳本修煉手冊---grep命令使用指南

grep 命令&#xff1a;從文本中精準篩選信息的實用指南 文章目錄grep 命令&#xff1a;從文本中精準篩選信息的實用指南一、什么是 grep&#xff1f;為什么要用它&#xff1f;二、grep 基本語法三、常用選項詳解&#xff08;附實例&#xff09;&#xff08;一&#xff09;模式選…

Python day51

浙大疏錦行 Python day51 復習日&#xff0c;DDPM class DenoiseDiffusion():def __init__(self, eps_model: nn.Module, n_steps: int, device: torch.device):super().__init__()self.eps_model eps_modelself.n_steps n_stepsself.device deviceself.beta torch.linsp…

數據結構:生成 (Generating) 一棵 AVL 樹

目錄 搭建“創世”的舞臺 注入序列&#xff0c;觀察演化 注入 10 注入 20 注入 30 注入 40 注入 50 注入 25 再次審視 上一講&#xff0c;我們已經從最根本的邏輯出發&#xff0c;推導出了 AVL 樹失衡時所必需的修復操作——旋轉 (Rotation)。 現在&#xff0c;我們將…

github 上傳代碼步驟

登錄GitHub → 點擊右上角 ?? → New Repository??。填寫倉庫名稱&#xff08;建議與本地項目同名&#xff09;&#xff0c;選擇 ??Public/Private??。??關鍵&#xff1a;不要勾選?? “Initialize with README”&#xff08;避免與本地倉庫沖突&#xff09;。點擊 …

陪診小程序系統開發:開啟智慧就醫新時代

在數字化浪潮的推動下&#xff0c;智慧醫療正逐漸成為現實。陪診小程序系統的開發&#xff0c;作為智慧醫療領域的一次重要創新&#xff0c;正以其獨特的魅力與優勢&#xff0c;引領著就醫新時代的到來。它不僅改變了傳統就醫模式&#xff0c;更以科技的力量&#xff0c;讓醫療…

朝花夕拾(七)--------從混淆矩陣到分類報告全面解析?

目錄 ??機器學習模型評估指南&#xff1a;從混淆矩陣到分類報告全面解析?? ??1. 引言?? ??2. 混淆矩陣&#xff1a;模型評估的基石?? ??2.1 什么是混淆矩陣&#xff1f;?? 2.2二分類問題的混淆矩陣 ??二分類場景下的具體案例? ?分析案例: 1.??案例…

Python讀取和設置PNG圖片的像素值

在Python中&#xff0c;可以使用Pillow庫或OpenCV庫來讀取和寫入PNG圖片的像素值。以下是兩種方法的詳細說明&#xff1a;1. 使用Pillow庫Pillow是Python中常用的圖像處理庫&#xff0c;支持多種圖像格式&#xff0c;包括PNG。讀取像素值from PIL import Imageimg Image.open(…

SkyWalking + Elasticsearch8 容器化部署指南:國內鏡像加速與生產級調優

SkyWalking Elasticsearch8 Docker 部署文檔本文提供在 Ubuntu 服務器上&#xff0c;使用 Docker Compose 部署 SkyWalking&#xff08;OAPUI&#xff09;與 Elasticsearch 8 的完整步驟&#xff0c;數據/日志落地到 /media/disk2 前置條件 Ubuntu&#xff0c;已具備 sudo 權限…