Closed yebukong closed 3 years ago
Too many keys are generated. There are only 10 target objects
请使用非自增 id 因为错误导致对像个数不一致无法回写 id
现在有个问题,10条数据中有一条数据由于某个字段数据为空导致数据库报错,这样会导致一条都插入不了,有没有什么方法是9条正常插入,那条有问题的数据不插入。
现在有个问题,10条数据中有一条数据由于某个字段数据为空导致数据库报错,这样会导致一条都插入不了,有没有什么方法是9条正常插入,那条有问题的数据不插入。
重写下批量方法,允许出错即可
现在有个问题,10条数据中有一条数据由于某个字段数据为空导致数据库报错,这样会导致一条都插入不了,有没有什么方法是9条正常插入,那条有问题的数据不插入。
重写下批量方法,允许出错即可
好的谢谢
当前使用版本(必填,否则不予处理)
3.4.2
该问题是如何引起的?(确定最新版也有问题再提!!!)
springboot 2.1.7.RELEASE druid 数据源,版本 1.2.3 并开启 poolPreparedStatements mysql版本 5.7.28
使用mp Service自带的saveBatch方法,主键使用自增id
批量插入,如果某批数据非空值为null,当前批次操作报非空异常错误,紧接着下一批次正常数据也会报错,
org.apache.ibatis.executor.ExecutorException: Too many keys are generated. There are only 10 target objects. You either specified a wrong 'keyProperty' or encountered a driver bug like #1523.
报错信息是mybatis解析自增id时主动抛出的在把druid poolPreparedStatements置为fasle后,不会有该报错 使用自己拼接的insert方法,并使用mybatis sqlsession ExecutorType.BATCH模式调用也不会报错
我个人猜测是因为mybatis 进行insert语句拼接时,如果字段值为空,那么这个语句就不会拼接该字段,而正常数据又会拼接,所以一个BATCH下会有多套sql 预处理语句,导致mysql返回的自增id存在问题,mybatis校验的时候就报错了 因为如果是字段过长导致首次报错,这时insert语句是一致的,后续异常就不会发生
重现步骤(如果有就写完整)
一张 自增id主键的表,以及一个非空字段 使用druid 数据源并启用poolPreparedStatements
多次调用Service自带的saveBatch方法,其中某个批次数据存在问题,如非空字段未置值,导致该批次数据insert失败 后一批正常数据会报
org.apache.ibatis.executor.ExecutorException: Too many keys are generated. There are only XXX target objects. You either specified a wrong 'keyProperty' or encountered a driver bug like #1523.
异常报错信息