From: David Gageot Date: Tue, 10 Jul 2012 12:46:06 +0000 (+0200) Subject: Make sure MyBatis is not configured to use generated keys in batch inserts X-Git-Tag: 3.2~153 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=9af370fabadd77a3714272fa9f60dc4ee0928c7e;p=sonarqube.git Make sure MyBatis is not configured to use generated keys in batch inserts Some databases support using generated keys (mysql), some don't (Postgresql), some make you think they do (Derby). With this check we make sure that we catch this kind of error as early as possible --- diff --git a/sonar-core/src/main/java/org/sonar/core/persistence/BatchSession.java b/sonar-core/src/main/java/org/sonar/core/persistence/BatchSession.java index 4c0d1604d6f..1b730018483 100644 --- a/sonar-core/src/main/java/org/sonar/core/persistence/BatchSession.java +++ b/sonar-core/src/main/java/org/sonar/core/persistence/BatchSession.java @@ -20,6 +20,9 @@ package org.sonar.core.persistence; import org.apache.ibatis.executor.BatchResult; +import org.apache.ibatis.executor.keygen.KeyGenerator; +import org.apache.ibatis.executor.keygen.NoKeyGenerator; +import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.ResultHandler; import org.apache.ibatis.session.RowBounds; @@ -102,15 +105,30 @@ public final class BatchSession implements SqlSession { } public int insert(String statement) { + makeSureGeneratedKeysAreNotUsedInBatchInserts(statement); increment(); return session.insert(statement); } public int insert(String statement, Object parameter) { + makeSureGeneratedKeysAreNotUsedInBatchInserts(statement); increment(); return session.insert(statement, parameter); } + private void makeSureGeneratedKeysAreNotUsedInBatchInserts(String statement) { + Configuration configuration = session.getConfiguration(); + if (null != configuration) { + MappedStatement mappedStatement = configuration.getMappedStatement(statement); + if (null != mappedStatement) { + KeyGenerator keyGenerator = mappedStatement.getKeyGenerator(); + if (!(keyGenerator instanceof NoKeyGenerator)) { + throw new IllegalStateException("Batch updates cannot use generated keys"); + } + } + } + } + public int update(String statement) { increment(); return session.update(statement);