java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > mybatis generator MySQL 自增ID出现重复

解决mybatis generator MySQL自增ID出现重复问题MySQLIntegrityConstraintViolationException

作者:lzh_me

在MySQL中使用MyBatis时,可能会遇到由于主键重复导致的插入失败问题,此问题通常发生在连续插入多条数据时,如果selectKey的order配置错误,如使用BEFORE而不是AFTER,将会导致获取的ID未更新,引起主键重复错误,正确的配置应使用AFTER

mybatis generator MySQL自增ID出现重复问题

PS:有时候不注意可能导致该问题,此处只做记录,以供参考。

代码说明:

数据库是MySQL,用generator 生成的mapper.xml中的代码,自增ID,使用的是selectKey来获取。

问题描述

insert的时候,添加的时候,第一条数据添加成功,接着添加第二条数据的时候会提示失败,失败的原因是ID还是使用的上一个ID值,主键重复导致插入失败。

异常如下:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '4' for key 'PRIMARY'

问题原因

BEFORE还是AFTER的问题

<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer">
      SELECT LAST_INSERT_ID()
    </selectKey>

需要注意的是

Oracle使用before,MySQL使用after

生成带代码的时候可以通过identity="true"来指定生成的selectKey是before还是after

<generatedKey column="id" sqlStatement="Mysql" identity="true" />

注:

使用 useGeneratedKeys="true" keyProperty="id" 不存在该问题。

mybatis generator生成实体时出现重复

java项目 中使用 org.mybatis.generator生成mysql数据库实体时,由于mysql 数据库中存在多个库,如果库中出现重复表时,会出现生成的实体代码出现重复问题,原因是数据库生成实体时会扫描所有的库,

解决方法

1、第一种

jdbc:mysql://localhost:3306/table?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&nullCatalogMeansCurrent=true

在连接串中加入nullCatalogMeansCurrent=true就行了

2、第二种方式是设置

<table tableName="table" catalog="dataName"></table> 

使用catalog指定库名

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文