mybatis-plus插入数据时,关于id没有赋值,系统自动赋值,并报错Could not set property ‘id‘ of ‘***‘ with value

  • 赶时间的同学可以直接看文章最后的结果

  • 创建了一张表,表里面有id字段,但是并没有声明它为主键
    叫我红领巾

  • 对应java实体类为
    叫我红领巾

  • 然后开始inset,随便写个伪代码

    User user = new User();
    user.setId("");
    user.setName("测试");
    this.insert(user);
    

    然后就报错了,一看报错信息是
    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??
    我并没有设置id啊,看着这有规则数字,很像是mybatis-plus自动生成的主键值

  • 然后就翻了翻mybatis-plus的大致源码,找到idType类

  • 看到mybatis-plus有这5中主键生成类型,一般对应我们数据库表中id的生成类型
    叫我红领巾

  • 比如我设置我得实体类id的生成类型为uuid
    叫我红领巾

  • 以上一般是我们的正常操作

  • 现在的我不想在这个表中建立主键,我想插入数据的时候,先不塞id的值,我就是想写bug(🤭开玩笑啊),这样怎么弄呢

  • 我不添加@TableId注解,不设置id的类型不行了吗,答案是不行的
    在这里插入图片描述

  • 如果你的实体类中有字段名定义为了“id”,mybatis-plus就默认你这个字段是主键,就算你不定义它的生成类型,mybatis-plus在自动装载的时候会帮你把id设置为默认类型,而默认的idType就是ID_WORKER,全局唯一

    在这里插入图片描述

  • 那好,我加上主键@TableId

  • 既然我这个表没有主键,我也不想塞值进去,那我把实体里面的id类型设置为

    @TableId(type = IdType.NONE)
    	private String id;
    
  • 这个行不行呢,答案还是是不行的,如下

  • 找到TableInfoHelper 这个类,里面有初始化table的方法 initTableId
    叫我红领巾
    里面进行了判断,如果idType为NONE,还是会把id的类型设置成全局默认类型ID-WORKER
    哈哈,由此可以看出mybatis-plus怕我们忘记设置主键id真是操碎了心啊

  • 好了,上面5中id生成的类型只有input看着可以满足我们的需求了

  • 这个顾名思义就是用户塞什么值就是什么值

  • 我们把idType设置为

    @TableId(type = IdType.INPUT)
    private String id;
    

    这样我们就可以随意的写入id任何值了,叫我红领巾。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值