目录
- MyBATis-plus插入数据遇到主键没默认值
- mybatis-plus插入数据时,关于id没有赋值,系统自动赋值,并报错Could not set property ‘id‘ of ‘***‘ with value
- 总结
Mybatis-plus插入数据遇到主键没默认值
新增数据时报
Java.sql.SQLException: Field 'id' doesn't have a default value
mybatis-plus的insert方法,在底层会默认生成一个Long类型的UUID,这就导致跟数据库里面类型不一致,把数据库默认自增的主键给禁了
主键生成方式类型如下(IdType):
AUTO(0, "数据库ID自增"), INPUT(1, "用户输入ID"), ID_WORKER(2, "全局唯一ID"), UUID(3, "全局唯一ID"), NONE(4, "该类型为未设置主键类型"), ID_WORKER_STR(5, "字符串全局唯一ID");
设置主键的生成方式
@TableId(value = "id",type = IdType.INPUT) // 主键手动输入
mybatis-plus插入数据时,关于id没有赋值,系统自动赋值,并报错Could not set property ‘id‘ of ‘***&lsqwww.devze.comuo; with value
赶时间的同学可以直接看文章最后的结果
创建了一张表,表里面有id字段,但是并没有声明它为主键
对应java实体类为
然后开始inset,随便写个伪代码
User user = new User(); user.setId(""); user.setName("测试"); this.insert(user);
然后就报错了,www.devze.com一看报错信息是
org.mybatis.spring.MyBatisSystemException: nested exception is org.apalISfHBwRWche.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设lISfHBwRW置为默认类型,而默认的idType就是ID_WORKER,全局唯一
那好,我加上主键@TableId
既然我这个表没有主键,我也不想塞值进去,那我把实体里面的id类型设置为
@TableId(type = IdType.NONE) private String id;
这个行不行呢,答案还是是不行的,如下
找到TableInfoHelper 这个类,里面有初始化table的方法 initTableId
里面进行了判断,如果idType为NONE,还是会把id的类型设置成全局默认类型ID-WORKER
哈哈,由此可以看出mybatilISfHBwRWs-plus怕我们忘记设置主键id真是操碎了心啊
好了,上面5中id生成的类型只有input看着可以满足我们的需求了
这个顾名思义就是用户塞什么值就是什么值
我们把idType设置为
@TableId(type = IdType.INPUT) private String id;
这样我们就可以随意的写入id任何值了,。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论