Mybatis-plus插入數(shù)據(jù)遇到主鍵沒(méi)有默認(rèn)值的情況
Mybatis-plus插入數(shù)據(jù)遇到主鍵沒(méi)默認(rèn)值
新增數(shù)據(jù)時(shí)報(bào)
java.sql.SQLException: Field 'id' doesn't have a default value
mybatis-plus的insert方法,在底層會(huì)默認(rèn)生成一個(gè)Long類型的UUID,這就導(dǎo)致跟數(shù)據(jù)庫(kù)里面類型不一致,把數(shù)據(jù)庫(kù)默認(rèn)自增的主鍵給禁了
主鍵生成方式類型如下(IdType):
AUTO(0, "數(shù)據(jù)庫(kù)ID自增"), INPUT(1, "用戶輸入ID"), ID_WORKER(2, "全局唯一ID"), UUID(3, "全局唯一ID"), NONE(4, "該類型為未設(shè)置主鍵類型"), ID_WORKER_STR(5, "字符串全局唯一ID");
設(shè)置主鍵的生成方式
@TableId(value = "id",type = IdType.INPUT) // 主鍵手動(dòng)輸入
mybatis-plus插入數(shù)據(jù)時(shí),關(guān)于id沒(méi)有賦值,系統(tǒng)自動(dòng)賦值,并報(bào)錯(cuò)Could not set property ‘id‘ of ‘***‘ with value
趕時(shí)間的同學(xué)可以直接看文章最后的結(jié)果
創(chuàng)建了一張表,表里面有id字段,但是并沒(méi)有聲明它為主鍵
對(duì)應(yīng)java實(shí)體類為
然后開(kāi)始inset,隨便寫(xiě)個(gè)偽代碼
User user = new User(); user.setId(""); user.setName("測(cè)試"); this.insert(user);
然后就報(bào)錯(cuò)了,一看報(bào)錯(cuò)信息是
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException:
Could not set property ‘id’ of 'class User ’ with value ‘1278867511785242626’
Cause: java.lang.IllegalArgumentException: argument type mismatch
what??
我并沒(méi)有設(shè)置id啊,看著這有規(guī)則數(shù)字,很像是mybatis-plus自動(dòng)生成的主鍵值
然后就翻了翻mybatis-plus的大致源碼,找到idType類
看到mybatis-plus有這5中主鍵生成類型,一般對(duì)應(yīng)我們數(shù)據(jù)庫(kù)表中id的生成類型
比如我設(shè)置我得實(shí)體類id的生成類型為uuid
以上一般是我們的正常操作
現(xiàn)在的我不想在這個(gè)表中建立主鍵,我想插入數(shù)據(jù)的時(shí)候,先不塞id的值,我就是想寫(xiě)bug(??開(kāi)玩笑?。?,這樣怎么弄呢
我不添加@TableId
注解,不設(shè)置id的類型不行了嗎,答案是不行的
如果你的實(shí)體類中有字段名定義為了“id”,mybatis-plus就默認(rèn)你這個(gè)字段是主鍵,就算你不定義它的生成類型,mybatis-plus在自動(dòng)裝載的時(shí)候會(huì)幫你把id設(shè)置為默認(rèn)類型,而默認(rèn)的idType就是ID_WORKER,全局唯一
那好,我加上主鍵@TableId
既然我這個(gè)表沒(méi)有主鍵,我也不想塞值進(jìn)去,那我把實(shí)體里面的id類型設(shè)置為
@TableId(type = IdType.NONE) private String id;
這個(gè)行不行呢,答案還是是不行的,如下
找到TableInfoHelper 這個(gè)類,里面有初始化table的方法 initTableId
里面進(jìn)行了判斷,如果idType為NONE,還是會(huì)把id的類型設(shè)置成全局默認(rèn)類型ID-WORKER
哈哈,由此可以看出mybatis-plus怕我們忘記設(shè)置主鍵id真是操碎了心啊
好了,上面5中id生成的類型只有input看著可以滿足我們的需求了
這個(gè)顧名思義就是用戶塞什么值就是什么值
我們把idType設(shè)置為
@TableId(type = IdType.INPUT) private String id;
這樣我們就可以隨意的寫(xiě)入id任何值了,。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Springboot jar包 idea 遠(yuǎn)程調(diào)試的操作過(guò)程
文章介紹了如何在IntelliJ IDEA中遠(yuǎn)程調(diào)試Spring Boot項(xiàng)目的Jar包,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-11-11spring framework體系結(jié)構(gòu)及模塊jar依賴關(guān)系詳解
在本篇文章里小編給大家整理的是關(guān)于spring framework體系結(jié)構(gòu)及模塊jar依賴關(guān)系,對(duì)此有興趣的朋友們可以學(xué)習(xí)下。2019-09-09MybatisPlus?自定義插件實(shí)現(xiàn)攔截SQL修改功能(實(shí)例詳解)
這篇文章主要介紹了MybatisPlus?自定義插件實(shí)現(xiàn)攔截SQL修改功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11Java中Runnable和Callable分別什么時(shí)候使用
提到 Java 就不得不說(shuō)多線程了,就算你不想說(shuō),面試官也得讓你說(shuō)呀,那說(shuō)到線程,就不得不說(shuō)Runnable和Callable這兩個(gè)家伙了,二者在什么時(shí)候使用呢,下面就來(lái)和簡(jiǎn)單講講2023-08-08jcl與jul?log4j1?log4j2?logback日志系統(tǒng)機(jī)制及集成原理
這篇文章主要介紹了jcl與jul?log4j1?log4j2?logback的集成原理,Apache?Commons-logging?通用日志框架與日志系統(tǒng)的機(jī)制,有需要的朋友可以借鑒參考下2022-03-03Java動(dòng)態(tài)循環(huán)隊(duì)列是如何實(shí)現(xiàn)的
今天帶大家學(xué)習(xí)java隊(duì)列的相關(guān)知識(shí),文章圍繞著如何實(shí)現(xiàn)Java動(dòng)態(tài)循環(huán)隊(duì)列展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06淺談Sharding-JDBC強(qiáng)制路由案例實(shí)戰(zhàn)
本文主要介紹了淺談Sharding-JDBC強(qiáng)制路由案例實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07