主键冲突异常 DuplicateKeyException
org.springframework.dao.DuplicateKeyException Exception thrown when an attempt to insert or update data results in violation of an primary key or unique constraint. Note that this is not necessarily a purely relational concept; unique primary keys are required by most database types. Author: Thomas Risberg
代码片段
import org.springframework.dao.DuplicateKeyException; try{ someMapper.insert(someBean); //TODO something }catch(DuplicateKeyException e){ //TODO something else }
补充:20211121
如何快速测试这个异常
建一个表,设置一个唯一索引
CREATE TABLE `aa` ( `a` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL , UNIQUE INDEX `a` (`a`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC ;
mapper
public interface UserMapper { @Insert("insert into aa (a) values ('1')") public void inserta(); }
test
@Test public void testaa() { userMapper.inserta(); userMapper.inserta(); }
异常
org.springframework.dao.DuplicateKeyException:
### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'a'
### The error may exist in cn/xs/qishi/wiki/mapper/UserMapper.java (best guess)
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: insert into aa (a) values ('1')
### Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'a'
; Duplicate entry '1' for key 'a'; nested exception is java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'a'
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:243)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
at com.sun.proxy.$Proxy33.insert(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:278)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:62)
at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:152)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:85)
at com.sun.proxy.$Proxy35.inserta(Unknown Source)
at cn.xs.qishi.wiki.mapper.UserMapperTest.testaa(UserMapperTest.java:41)
场景,如果少量重复,不必每次都去查询检查是否存在再去插入数据。节省大量查询工作。