]> source.dussan.org Git - sonarqube.git/commitdiff
Make sure MyBatis is not configured to use generated keys in batch inserts
authorDavid Gageot <david@gageot.net>
Tue, 10 Jul 2012 12:46:06 +0000 (14:46 +0200)
committerDavid Gageot <david@gageot.net>
Tue, 10 Jul 2012 12:46:06 +0000 (14:46 +0200)
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

sonar-core/src/main/java/org/sonar/core/persistence/BatchSession.java

index 4c0d1604d6f9d101407b7dfa4d4a4cd832a7fd27..1b7300184831a8f3707182c348981de4ab83ef96 100644 (file)
@@ -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);