You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2014/12/15 07:31:23 UTC

cayenne git commit: add skip primary key param

Repository: cayenne
Updated Branches:
  refs/heads/master 26e22a3fd -> 78558aaa4


add skip primary key param


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/78558aaa
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/78558aaa
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/78558aaa

Branch: refs/heads/master
Commit: 78558aaa4866006995b6f54c78026849fcace925
Parents: 26e22a3
Author: alexkolonitsky <Al...@gmail.com>
Authored: Fri Dec 12 21:36:59 2014 +0300
Committer: alexkolonitsky <Al...@gmail.com>
Committed: Fri Dec 12 21:36:59 2014 +0300

----------------------------------------------------------------------
 .../org/apache/cayenne/access/DbLoader.java     |   5 +-
 .../access/loader/DbLoaderConfiguration.java    |  25 +++-
 .../java/org/apache/cayenne/merge/DbMerger.java |  78 ++++-------
 .../apache/cayenne/merge/DbMergerConfig.java    |  63 +++++++++
 .../apache/cayenne/util/EntityMergeSupport.java |   2 +-
 .../org/apache/cayenne/merge/DbMergerTest.java  |  25 ++--
 .../org/apache/cayenne/merge/MergeCase.java     |   3 +-
 .../apache/cayenne/tools/DbImporterTask.java    |   4 +-
 .../cayenne/tools/dbimport/DbImportAction.java  |   4 +-
 .../tools/dbimport/DbImportConfiguration.java   |  13 ++
 .../config/DefaultReverseEngineeringLoader.java |   1 +
 .../dbimport/config/ReverseEngineering.java     |  15 +-
 .../DefaultReverseEngineeringLoaderTest.java    |  12 ++
 .../tools/build-skip-primary-key-loading.xml    |  37 +++++
 ...reverseEngineering-skipPrimaryKeyLoading.xml |  23 ++++
 .../apache/cayenne/tools/DbImporterMojo.java    |   3 +-
 .../tools/DbImporterMojoConfigurationTest.java  |   5 +
 .../cayenne/tools/DbImporterMojoTest.java       | 137 +++++++++++--------
 .../config/pom-skip-primary-key-loading.xml     |  39 ++++++
 .../dbimport/testSkipPrimaryKeyLoading-pom.xml  |  43 ++++++
 .../dbimport/testSkipPrimaryKeyLoading.map.xml  |  35 +++++
 .../testSkipPrimaryKeyLoading.map.xml-result    |  41 ++++++
 .../dbimport/testSkipPrimaryKeyLoading.sql      |  30 ++++
 .../testSkipRelationshipsLoading.map.xml        |  55 ++++++++
 .../testSkipRelationshipsLoading.map.xml-result |  67 +++++----
 .../dbimport/testSkipRelationshipsLoading.sql   |  16 ++-
 26 files changed, 616 insertions(+), 165 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/cayenne-server/src/main/java/org/apache/cayenne/access/DbLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DbLoader.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DbLoader.java
index 7acda33..8b3029e 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DbLoader.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DbLoader.java
@@ -322,8 +322,9 @@ public class DbLoader {
 
             loadDbAttributes(config.getFiltersConfig(), tablesMap.getKey(), tablesMap.getValue());
 
-            // get primary keys for each table and store it in dbEntity
-            getPrimaryKeyForTable(tablesMap.getValue());
+            if (!config.isSkipPrimaryKeyLoading()) {
+                getPrimaryKeyForTable(tablesMap.getValue());
+            }
         }
 
         return dbEntityList;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/cayenne-server/src/main/java/org/apache/cayenne/access/loader/DbLoaderConfiguration.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/loader/DbLoaderConfiguration.java b/cayenne-server/src/main/java/org/apache/cayenne/access/loader/DbLoaderConfiguration.java
index 290da78..fb80d2d 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/loader/DbLoaderConfiguration.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/loader/DbLoaderConfiguration.java
@@ -40,8 +40,7 @@ public class DbLoaderConfiguration {
 
 /*
     // TODO: Andrus, 10/29/2005 - this type of filtering should be delegated to adapter
-    */
-/* TODO by default should skip name.startsWith("BIN$") *//*
+       TODO by default should skip name.startsWith("BIN$")
 
     private NameFilter tableFilter = NamePatternMatcher.build(null, null, "BIN$");
 
@@ -70,6 +69,8 @@ public class DbLoaderConfiguration {
 
     private Boolean skipRelationshipsLoading;
 
+    private Boolean skipPrimaryKeyLoading;
+
     private String[] tableTypes;
 
     private FiltersConfig filtersConfig;
@@ -110,7 +111,7 @@ public class DbLoaderConfiguration {
         this.filtersConfig = filtersConfig;
     }
 
-    public Boolean isSkipRelationshipsLoading() {
+    public boolean isSkipRelationshipsLoading() {
         return skipRelationshipsLoading != null && skipRelationshipsLoading;
     }
 
@@ -122,13 +123,29 @@ public class DbLoaderConfiguration {
         this.skipRelationshipsLoading = skipRelationshipsLoading;
     }
 
+    public void setSkipPrimaryKeyLoading(Boolean skipPrimaryKeyLoading) {
+        this.skipPrimaryKeyLoading = skipPrimaryKeyLoading;
+    }
+
+    public boolean getSkipPrimaryKeyLoading() {
+        return skipPrimaryKeyLoading;
+    }
+
+    public boolean isSkipPrimaryKeyLoading() {
+        return skipPrimaryKeyLoading != null && skipPrimaryKeyLoading;
+    }
+
     @Override
     public String toString() {
         String res = "EntitiesFilters: " + getFiltersConfig();
-        if (skipRelationshipsLoading != null && skipRelationshipsLoading) {
+        if (isSkipRelationshipsLoading()) {
             res += "\n Skip Loading Relationships! \n";
         }
 
+        if (isSkipPrimaryKeyLoading()) {
+            res += "\n Skip Loading PrimaryKeys! \n";
+        }
+
         return res;
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/cayenne-server/src/main/java/org/apache/cayenne/merge/DbMerger.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/merge/DbMerger.java b/cayenne-server/src/main/java/org/apache/cayenne/merge/DbMerger.java
index 2c17361..e537b8a 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/merge/DbMerger.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/merge/DbMerger.java
@@ -36,7 +36,6 @@ import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.DbLoader;
 import org.apache.cayenne.access.loader.DbLoaderConfiguration;
 import org.apache.cayenne.access.loader.DefaultDbLoaderDelegate;
-import org.apache.cayenne.access.loader.NameFilter;
 import org.apache.cayenne.access.loader.filters.DbPath;
 import org.apache.cayenne.access.loader.filters.FiltersConfig;
 import org.apache.cayenne.dba.DbAdapter;
@@ -73,36 +72,24 @@ public class DbMerger {
      * Create and return a {@link List} of {@link MergerToken}s to alter the given
      * {@link DataNode} to match the given {@link DataMap}
      */
-    public List<MergerToken> createMergeTokens(DataNode dataNode, DataMap existing, DbLoaderConfiguration config) {
-        return createMergeTokens(dataNode.getDataSource(), dataNode.getAdapter(), existing, config);
-    }
-
-    /**
-     * Create and return a {@link List} of {@link MergerToken}s to alter the given
-     * {@link DataNode} to match the given {@link DataMap}
-     */
-    public List<MergerToken> createMergeTokens(DbLoader dbLoader, DataMap existing, DbLoaderConfiguration config) {
-        return createMergeTokens(existing, loadDataMapFromDb(dbLoader, config), config.getFiltersConfig());
-    }
-
-    /**
-     * Create and return a {@link List} of {@link MergerToken}s to alter the given
-     * {@link DataNode} to match the given {@link DataMap}
-     */
     public List<MergerToken> createMergeTokens(DataSource dataSource, DbAdapter adapter, DataMap existingDataMap, DbLoaderConfiguration config) {
-        return createMergeTokens(existingDataMap, loadDataMapFromDb(dataSource, adapter, config), config.getFiltersConfig());
+        return createMergeTokens(
+                existingDataMap,
+                loadDataMapFromDb(dataSource, adapter, config),
+                config
+        );
     }
 
     /**
      * Create and return a {@link List} of {@link MergerToken}s to alter the given
      * {@link DataNode} to match the given {@link DataMap}
      */
-    public List<MergerToken> createMergeTokens(DataMap existing, DataMap loadedFomDb, FiltersConfig filtersConfig) {
+    public List<MergerToken> createMergeTokens(DataMap existing, DataMap loadedFomDb, DbLoaderConfiguration config) {
 
         loadedFomDb.setQuotingSQLIdentifiers(existing.isQuotingSQLIdentifiers());
 
-        List<MergerToken> tokens = createMergeTokens(filter(existing, filtersConfig), loadedFomDb.getDbEntities());
-
+        List<MergerToken> tokens
+                = createMergeTokens(filter(existing, config.getFiltersConfig()), loadedFomDb.getDbEntities(), config);
 
         // sort. use a custom Comparator since only toDb tokens are comparable by now
         Collections.sort(tokens, new Comparator<MergerToken>() {
@@ -110,9 +97,8 @@ public class DbMerger {
             public int compare(MergerToken o1, MergerToken o2) {
                 if (o1 instanceof AbstractToDbToken
                         && o2 instanceof AbstractToDbToken) {
-                    AbstractToDbToken d1 = (AbstractToDbToken) o1;
-                    AbstractToDbToken d2 = (AbstractToDbToken) o2;
-                    return d1.compareTo(d2);
+
+                    return ((AbstractToDbToken) o1).compareTo(o2);
                 }
                 return 0;
             }
@@ -136,42 +122,22 @@ public class DbMerger {
         try {
             conn = dataSource.getConnection();
 
-            DbLoader dbLoader = new DbLoader(conn, adapter, new DefaultDbLoaderDelegate());
-            return loadDataMapFromDb(dbLoader, config);
-        }
-        catch (SQLException e) {
+            return new DbLoader(conn, adapter, new DefaultDbLoaderDelegate()).load(config);
+        } catch (SQLException e) {
             throw new CayenneRuntimeException("Can't doLoad dataMap from db.", e);
-        }
-        finally {
+        } finally {
             if (conn != null) {
                 try {
                     conn.close();
-                }
-                catch (SQLException e) {
+                } catch (SQLException e) {
                     // Do nothing.
                 }
             }
         }
     }
 
-    private DataMap loadDataMapFromDb(DbLoader dbLoader, DbLoaderConfiguration config) {
-        try {
-            return dbLoader.load(config);
-        } catch (SQLException e) {
-            // TODO log
-        }
-
-        return new DataMap();
-    }
-
-    /**
-     *
-     *
-     * @param existing
-     * @param loadedFromDb
-     * @return
-     */
-    public List<MergerToken> createMergeTokens(Collection<DbEntity> existing, Collection<DbEntity> loadedFromDb) {
+    public List<MergerToken> createMergeTokens(Collection<DbEntity> existing, Collection<DbEntity> loadedFromDb,
+                                               DbLoaderConfiguration config) {
         Collection<DbEntity> dbEntitiesToDrop = new LinkedList<DbEntity>(loadedFromDb);
 
         List<MergerToken> tokens = new LinkedList<MergerToken>();
@@ -192,12 +158,16 @@ public class DbMerger {
             dbEntitiesToDrop.remove(detectedEntity);
 
             tokens.addAll(checkRelationshipsToDrop(dbEntity, detectedEntity));
-            tokens.addAll(checkRelationshipsToAdd(dbEntity, detectedEntity));
+            if (!config.isSkipRelationshipsLoading()) {
+                tokens.addAll(checkRelationshipsToAdd(dbEntity, detectedEntity));
+            }
             tokens.addAll(checkRows(dbEntity, detectedEntity));
 
-            MergerToken token = checkPrimaryKeyChange(dbEntity, detectedEntity);
-            if (token != null) {
-                tokens.add(token);
+            if (!config.isSkipPrimaryKeyLoading()) {
+                MergerToken token = checkPrimaryKeyChange(dbEntity, detectedEntity);
+                if (token != null) {
+                    tokens.add(token);
+                }
             }
         }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/cayenne-server/src/main/java/org/apache/cayenne/merge/DbMergerConfig.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/merge/DbMergerConfig.java b/cayenne-server/src/main/java/org/apache/cayenne/merge/DbMergerConfig.java
new file mode 100644
index 0000000..e8df4b8
--- /dev/null
+++ b/cayenne-server/src/main/java/org/apache/cayenne/merge/DbMergerConfig.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cayenne.merge;
+
+import org.apache.cayenne.access.loader.filters.FiltersConfig;
+
+/**
+ * @since 4.0
+ */
+public class DbMergerConfig {
+
+    private FiltersConfig filtersConfig;
+
+    private boolean skipRelationships;
+
+    private boolean skipPrimaryKey;
+
+    public DbMergerConfig(FiltersConfig filtersConfig, boolean skipRelationships, boolean skipPrimaryKey) {
+        this.filtersConfig = filtersConfig;
+        this.skipRelationships = skipRelationships;
+        this.skipPrimaryKey = skipPrimaryKey;
+    }
+
+    public void setSkipRelationships(boolean skipRelationships) {
+        this.skipRelationships = skipRelationships;
+    }
+
+    public boolean isSkipRelationships() {
+        return skipRelationships;
+    }
+
+    public void setSkipPrimaryKey(boolean skipPrimaryKey) {
+        this.skipPrimaryKey = skipPrimaryKey;
+    }
+
+    public boolean isSkipPrimaryKey() {
+        return skipPrimaryKey;
+    }
+
+    public FiltersConfig getFiltersConfig() {
+        return filtersConfig;
+    }
+
+    public void setFiltersConfig(FiltersConfig filtersConfig) {
+        this.filtersConfig = filtersConfig;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java b/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java
index 2607bcd..9772794 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java
@@ -386,7 +386,7 @@ public class EntityMergeSupport {
      * Returns registered listeners
      */
     public EntityMergeListener[] getEntityMergeListeners() {
-        return listeners.toArray(new EntityMergeListener[0]);
+        return listeners.toArray(new EntityMergeListener[listeners.size()]);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/cayenne-server/src/test/java/org/apache/cayenne/merge/DbMergerTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/merge/DbMergerTest.java b/cayenne-server/src/test/java/org/apache/cayenne/merge/DbMergerTest.java
index 58ed91d..894129d 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/merge/DbMergerTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/merge/DbMergerTest.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.merge;
 
+import org.apache.cayenne.access.loader.DbLoaderConfiguration;
 import org.apache.cayenne.dba.hsqldb.HSQLMergerFactory;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
@@ -37,7 +38,7 @@ public class DbMergerTest {
     @Test
     public void testEmptyDataMap() throws Exception {
         assertEquals(0, dbMerger().createMergeTokens(new ArrayList<DbEntity>(0),
-                new ArrayList<DbEntity>(0)).size());
+                new ArrayList<DbEntity>(0), new DbLoaderConfiguration()).size());
     }
 
     @Test
@@ -49,7 +50,7 @@ public class DbMergerTest {
         DataMap existing = dataMap().with(dbEntity).build();
 
         List<MergerToken> tokens = dbMerger().createMergeTokens(existing.getDbEntities(),
-                new ArrayList<DbEntity>(0));
+                new ArrayList<DbEntity>(0), new DbLoaderConfiguration());
 
         assertEquals(1, tokens.size());
         assertEquals(factory().createCreateTableToDb(dbEntity.build()).getTokenValue(),
@@ -63,7 +64,8 @@ public class DbMergerTest {
                 dbAttr("attr01").typeInt()
         )).build();
 
-        List<MergerToken> tokens = dbMerger().createMergeTokens(new ArrayList<DbEntity>(0), db.getDbEntities());
+        List<MergerToken> tokens = dbMerger().createMergeTokens(new ArrayList<DbEntity>(0),
+                db.getDbEntities(), new DbLoaderConfiguration());
 
         assertEquals(1, tokens.size());
         assertEquals(factory().createDropTableToDb(db.getDbEntity("table1")).getTokenValue(),
@@ -83,7 +85,8 @@ public class DbMergerTest {
                 dbAttr("attr01").typeInt()
         )).build();
 
-        List<MergerToken> tokens = dbMerger().createMergeTokens(existing.getDbEntities(), db.getDbEntities());
+        List<MergerToken> tokens = dbMerger().createMergeTokens(existing.getDbEntities(),
+                db.getDbEntities(), new DbLoaderConfiguration());
 
         assertEquals(1, tokens.size());
 
@@ -117,7 +120,8 @@ public class DbMergerTest {
          .build();
 
 
-        List<MergerToken> tokens = dbMerger().createMergeTokens(existing.getDbEntities(), db.getDbEntities());
+        List<MergerToken> tokens = dbMerger().createMergeTokens(existing.getDbEntities(),
+                db.getDbEntities(), new DbLoaderConfiguration());
 
         assertEquals(1, tokens.size());
 
@@ -155,7 +159,8 @@ public class DbMergerTest {
          .build();
 
 
-        List<MergerToken> tokens = dbMerger().createMergeTokens(existing.getDbEntities(), db.getDbEntities());
+        List<MergerToken> tokens = dbMerger().createMergeTokens(existing.getDbEntities(),
+                db.getDbEntities(), new DbLoaderConfiguration());
 
         assertEquals(2, tokens.size());
 
@@ -193,7 +198,7 @@ public class DbMergerTest {
          .build();
 
 
-        List<MergerToken> tokens = dbMerger().createMergeTokens(existing.getDbEntities(), db.getDbEntities());
+        List<MergerToken> tokens = dbMerger().createMergeTokens(existing.getDbEntities(), db.getDbEntities(), new DbLoaderConfiguration());
 
         assertEquals(1, tokens.size());
 
@@ -215,7 +220,8 @@ public class DbMergerTest {
                 dbAttr("attr02").typeInt()
         )).build();
 
-        List<MergerToken> tokens = dbMerger().createMergeTokens(existing.getDbEntities(), db.getDbEntities());
+        List<MergerToken> tokens = dbMerger().createMergeTokens(existing.getDbEntities(),
+                db.getDbEntities(), new DbLoaderConfiguration());
 
         assertEquals(1, tokens.size());
 
@@ -241,7 +247,8 @@ public class DbMergerTest {
         )).build();
 
 
-        assertEquals(0, dbMerger().createMergeTokens(dataMap1.getDbEntities(), dataMap2.getDbEntities()).size());
+        assertEquals(0, dbMerger().createMergeTokens(dataMap1.getDbEntities(),
+                dataMap2.getDbEntities(), new DbLoaderConfiguration()).size());
     }
 
     private DbMerger dbMerger() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/cayenne-server/src/test/java/org/apache/cayenne/merge/MergeCase.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/merge/MergeCase.java b/cayenne-server/src/test/java/org/apache/cayenne/merge/MergeCase.java
index 258f8a9..8dd6c18 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/merge/MergeCase.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/merge/MergeCase.java
@@ -109,7 +109,8 @@ public abstract class MergeCase extends ServerCase {
         DbLoaderConfiguration loaderConfiguration = new DbLoaderConfiguration();
         loaderConfiguration.setFiltersConfig(new FiltersConfig(new EntityFilters(DbPath.EMPTY, include("ARTIST|GALLERY|PAINTING|NEW_TABLE2?"), TRUE, TRUE)));
 
-        return createMerger(node.getAdapter().mergerFactory()).createMergeTokens(node, map, loaderConfiguration);
+        return createMerger(node.getAdapter().mergerFactory())
+                .createMergeTokens(node.getDataSource(), node.getAdapter(), map, loaderConfiguration);
     }
 
 	/**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
index 5750531..72e4a24 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
@@ -75,8 +75,10 @@ public class DbImporterTask extends Task {
 
         Log logger = new AntLogger(this);
         config.setLogger(logger);
+        config.setSkipRelationshipsLoading(reverseEngineering.getSkipRelationshipsLoading());
+        config.setSkipPrimaryKeyLoading(reverseEngineering.getSkipPrimaryKeyLoading());
         config.setTableTypes(reverseEngineering.getTableTypes());
-        
+
         Injector injector = DIBootstrap.createInjector(new ToolsModule(logger), new DbImportModule());
 
         try {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportAction.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportAction.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportAction.java
index 60194f3..bf981ee 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportAction.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportAction.java
@@ -107,8 +107,8 @@ public class DbImportAction {
         } else {
             MergerFactory mergerFactory = adapter.mergerFactory();
 
-            List<MergerToken> mergeTokens = new DbMerger(mergerFactory).createMergeTokens(existing, loadedFomDb,
-                    config.getDbLoaderConfig().getFiltersConfig());
+            List<MergerToken> mergeTokens = new DbMerger(mergerFactory)
+                    .createMergeTokens(existing, loadedFomDb, config.getDbLoaderConfig());
             if (mergeTokens.isEmpty()) {
                 logger.info("No changes to import.");
                 return;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
index 51c22bf..7d71aaa 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
@@ -34,6 +34,7 @@ import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.naming.ObjectNameGenerator;
+import org.apache.cayenne.merge.DbMergerConfig;
 import org.apache.cayenne.merge.DefaultModelMergeDelegate;
 import org.apache.cayenne.merge.ModelMergeDelegate;
 import org.apache.cayenne.resource.URLResource;
@@ -326,7 +327,19 @@ public class DbImportConfiguration {
         this.dbLoaderConfiguration.setSkipRelationshipsLoading(skipRelationshipsLoading);
     }
 
+    public void setSkipPrimaryKeyLoading(Boolean skipPrimaryKeyLoading) {
+        this.dbLoaderConfiguration.setSkipPrimaryKeyLoading(skipPrimaryKeyLoading);
+    }
+
     public void setTableTypes(String[] tableTypes) {
         dbLoaderConfiguration.setTableTypes(tableTypes);
     }
+
+    public DbMergerConfig getDbMergerConfig() {
+        return new DbMergerConfig(
+                getDbLoaderConfig().getFiltersConfig(),
+                getDbLoaderConfig().getSkipRelationshipsLoading(),
+                getDbLoaderConfig().getSkipPrimaryKeyLoading()
+        );
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/DefaultReverseEngineeringLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/DefaultReverseEngineeringLoader.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/DefaultReverseEngineeringLoader.java
index f7c3d97..807b7ff 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/DefaultReverseEngineeringLoader.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/DefaultReverseEngineeringLoader.java
@@ -58,6 +58,7 @@ public class DefaultReverseEngineeringLoader implements ReverseEngineeringLoader
 
             Element root = doc.getDocumentElement();
             engineering.setSkipRelationshipsLoading(loadBoolean(root, "skipRelationshipsLoading"));
+            engineering.setSkipPrimaryKeyLoading(loadBoolean(root, "skipPrimaryKeyLoading"));
             engineering.setTableTypes(loadTableTypes(root));
 
             engineering.setCatalogs(loadCatalogs(root));

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/ReverseEngineering.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/ReverseEngineering.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/ReverseEngineering.java
index b668ff9..ad42297 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/ReverseEngineering.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/ReverseEngineering.java
@@ -29,6 +29,8 @@ public class ReverseEngineering extends FilterContainer {
 
     private Boolean skipRelationshipsLoading;
 
+    private Boolean skipPrimaryKeyLoading;
+
     /*
      * Typical types are "TABLE",
      * "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY",
@@ -50,6 +52,14 @@ public class ReverseEngineering extends FilterContainer {
         this.skipRelationshipsLoading = skipRelationshipsLoading;
     }
 
+    public Boolean getSkipPrimaryKeyLoading() {
+        return skipPrimaryKeyLoading;
+    }
+
+    public void setSkipPrimaryKeyLoading(Boolean skipPrimaryKeyLoading) {
+        this.skipPrimaryKeyLoading = skipPrimaryKeyLoading;
+    }
+
     public Collection<Catalog> getCatalogs() {
         return catalogs;
     }
@@ -109,10 +119,11 @@ public class ReverseEngineering extends FilterContainer {
         if (skipRelationshipsLoading != null && skipRelationshipsLoading) {
             res.append("\n").append("        Skip Relationships Loading");
         }
+        if (skipPrimaryKeyLoading != null && skipPrimaryKeyLoading) {
+            res.append("\n").append("        Skip PrimaryKey Loading");
+        }
         res.append(super.toString("    "));
 
         return res.toString();
     }
-
-
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/config/DefaultReverseEngineeringLoaderTest.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/config/DefaultReverseEngineeringLoaderTest.java b/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/config/DefaultReverseEngineeringLoaderTest.java
index 7b0f21b..83af6df 100644
--- a/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/config/DefaultReverseEngineeringLoaderTest.java
+++ b/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/config/DefaultReverseEngineeringLoaderTest.java
@@ -212,6 +212,18 @@ public class DefaultReverseEngineeringLoaderTest {
     }
 
     @Test
+    public void testSkipPrimaryKeyLoading() throws Exception {
+        ReverseEngineering engineering = new DefaultReverseEngineeringLoader()
+                .load(getResource("reverseEngineering-skipPrimaryKeyLoading.xml"));
+
+        assertSkipPrimaryKeyLoading(engineering);
+    }
+
+    public static void assertSkipPrimaryKeyLoading(ReverseEngineering engineering) {
+        assertTrue(engineering.getSkipPrimaryKeyLoading());
+    }
+
+    @Test
     public void testTableTypes() throws Exception {
         ReverseEngineering engineering = new DefaultReverseEngineeringLoader()
                 .load(getResource("reverseEngineering-tableTypes.xml"));

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-primary-key-loading.xml
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-primary-key-loading.xml b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-primary-key-loading.xml
new file mode 100644
index 0000000..e438166
--- /dev/null
+++ b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/build-skip-primary-key-loading.xml
@@ -0,0 +1,37 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  -->
+
+<project name="MyProject" default="dist" basedir=".">
+
+    <taskdef name="cdbimport" classname="org.apache.cayenne.tools.DbImporterTask" taskname="cdbimport"
+             classpath="${basedir}"  />
+
+    <target name="dist">
+        <cdbimport map="${context.dir}/WEB-INF/DefaultMap.map.xml"
+                   adapter="org.apache.cayenne.dba.hsqldb.HSQLDBAdapter"
+                   driver="org.hsqldb.jdbcDriver"
+                   url="jdbc:hsqldb:hsql://localhost/bookmarker"
+                   username="sa"
+                   skipPrimaryKeyLoading="true">
+
+        </cdbimport>
+    </target>
+
+
+</project>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/cayenne-tools/src/test/resources/org/apache/cayenne/tools/dbimport/config/reverseEngineering-skipPrimaryKeyLoading.xml
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/resources/org/apache/cayenne/tools/dbimport/config/reverseEngineering-skipPrimaryKeyLoading.xml b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/dbimport/config/reverseEngineering-skipPrimaryKeyLoading.xml
new file mode 100644
index 0000000..e0d74bd
--- /dev/null
+++ b/cayenne-tools/src/test/resources/org/apache/cayenne/tools/dbimport/config/reverseEngineering-skipPrimaryKeyLoading.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  -->
+
+<reverseEngineering>
+    <skipPrimaryKeyLoading>true</skipPrimaryKeyLoading>
+</reverseEngineering>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java b/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
index e60794b..c8e0798 100644
--- a/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
+++ b/plugins/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
@@ -226,7 +226,7 @@ public class DbImporterMojo extends AbstractMojo {
      *
      * Default is <code>false</code>.
      *
-     * @parameter expression="${cdbimport.meaningfulPk}" default-value="false"
+     * @parameter expression="${cdbimport.meaningfulPk}"
      * @deprecated since 4.0 use meaningfulPkTables
      */
     private boolean meaningfulPk;
@@ -277,6 +277,7 @@ public class DbImporterMojo extends AbstractMojo {
         config.setFiltersConfig(new FiltersConfigBuilder(reverseEngineering)
                 .add(filterBuilder.build()).filtersConfig());
         config.setSkipRelationshipsLoading(reverseEngineering.getSkipRelationshipsLoading());
+        config.setSkipPrimaryKeyLoading(reverseEngineering.getSkipPrimaryKeyLoading());
         config.setTableTypes(reverseEngineering.getTableTypes());
         return config;
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoConfigurationTest.java
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoConfigurationTest.java b/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoConfigurationTest.java
index 8606277..8a195a6 100644
--- a/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoConfigurationTest.java
+++ b/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoConfigurationTest.java
@@ -81,6 +81,11 @@ public class DbImporterMojoConfigurationTest extends AbstractMojoTestCase {
     }
 
     @Test
+    public void testSkipPrimaryKeyLoading() throws Exception {
+        assertSkipPrimaryKeyLoading(getCdbImport("pom-skip-primary-key-loading.xml").getReverseEngineering());
+    }
+
+    @Test
     public void testTableTypes() throws Exception {
         assertTableTypes(getCdbImport("pom-table-types.xml").getReverseEngineering());
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java b/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java
index 98d8f0c..86d4762 100644
--- a/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java
+++ b/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java
@@ -42,6 +42,7 @@ import org.codehaus.plexus.util.FileUtils;
 import org.custommonkey.xmlunit.DetailedDiff;
 import org.custommonkey.xmlunit.Diff;
 import org.custommonkey.xmlunit.XMLUnit;
+import org.junit.Test;
 import org.xml.sax.SAXException;
 
 public class DbImporterMojoTest extends AbstractMojoTestCase {
@@ -71,61 +72,77 @@ public class DbImporterMojoTest extends AbstractMojoTestCase {
 		assertNull(getCdbImport("dbimporter-pom2.xml").toParameters().getDataMapFile());
 	}
 
-	private DbImporterMojo getCdbImport(String pomFileName) throws Exception {
-		return (DbImporterMojo) lookupMojo("cdbimport", getTestFile("src/test/resources/org/apache/cayenne/tools/"
-				+ pomFileName));
-	}
+    private DbImporterMojo getCdbImport(String pomFileName) throws Exception {
+        return (DbImporterMojo) lookupMojo("cdbimport",
+                getTestFile("src/test/resources/org/apache/cayenne/tools/" + pomFileName));
+    }
 
 	private void assertPathEquals(String expectedPath, String actualPath) {
 		assertEquals(new File(expectedPath), new File(actualPath));
 	}
 
+    @Test
 	public void testImportNewDataMap() throws Exception {
 		test("testImportNewDataMap");
 	}
 
+    @Test
 	public void testImportWithoutChanges() throws Exception {
 		test("testImportWithoutChanges");
 	}
 
+    @Test
 	public void testImportAddTableAndColumn() throws Exception {
 		test("testImportAddTableAndColumn");
 	}
 
+    @Test
 	public void testSimpleFiltering() throws Exception {
 		test("testSimpleFiltering");
 	}
 
+    @Test
 	public void testFilteringWithSchema() throws Exception {
 		test("testFilteringWithSchema");
 	}
 
+    @Test
 	public void testSchemasAndTableExclude() throws Exception {
 		test("testSchemasAndTableExclude");
 	}
 
+    @Test
 	public void testViewsExclude() throws Exception {
 		test("testViewsExclude");
 	}
-	
+
+    @Test
 	public void testTableTypes() throws Exception {
 		test("testTableTypes");
 	}
 
+    @Test
 	public void testDefaultPackage() throws Exception {
 		test("testDefaultPackage");
 	}
 
+    @Test
 	public void testSkipRelationshipsLoading() throws Exception {
 		test("testSkipRelationshipsLoading");
 	}
 
+    @Test
+	public void testSkipPrimaryKeyLoading() throws Exception {
+		test("testSkipPrimaryKeyLoading");
+	}
+
     /**
      * Q: what happens if a relationship existed over a column that was later deleted? and ‘skipRelLoading’ is true
      * A: it should remove relationship and column
      *
      * @throws Exception
      */
+    @Test
 	public void testPreserveRelationships() throws Exception {
 		test("testPreserveRelationships");
 	}
@@ -136,11 +153,66 @@ public class DbImporterMojoTest extends AbstractMojoTestCase {
      *
      * @throws Exception
      */
+    @Test
 	public void testUnFlattensManyToMany() throws Exception {
 		test("testUnFlattensManyToMany");
 	}
 
-	private void test(String name) throws Exception {
+    @Test
+    public void testFilteringConfig() throws Exception {
+        DbImporterMojo cdbImport = getCdbImport("config/pom-01.xml");
+
+        assertEquals(2, cdbImport.getReverseEngineering().getCatalogs().size());
+        Iterator<Catalog> iterator = cdbImport.getReverseEngineering().getCatalogs().iterator();
+        assertEquals("catalog-name-01", iterator.next().getName());
+
+        Catalog catalog = iterator.next();
+        assertEquals("catalog-name-02", catalog.getName());
+        Iterator<Schema> schemaIterator = catalog.getSchemas().iterator();
+
+        assertEquals("schema-name-01", schemaIterator.next().getName());
+
+        Schema schema = schemaIterator.next();
+        assertEquals("schema-name-02", schema.getName());
+
+        Iterator<IncludeTable> includeTableIterator = schema.getIncludeTables().iterator();
+        assertEquals("incTable-01", includeTableIterator.next().getPattern());
+
+        IncludeTable includeTable = includeTableIterator.next();
+        assertEquals("incTable-02", includeTable.getPattern());
+        assertEquals("includeColumn-01", includeTable.getIncludeColumns().iterator().next().getPattern());
+        assertEquals("excludeColumn-01", includeTable.getExcludeColumns().iterator().next().getPattern());
+
+        assertEquals("includeColumn-02", schema.getIncludeColumns().iterator().next().getPattern());
+        assertEquals("excludeColumn-02", schema.getExcludeColumns().iterator().next().getPattern());
+
+        assertEquals("includeColumn-03", catalog.getIncludeColumns().iterator().next().getPattern());
+        assertEquals("excludeColumn-03", catalog.getExcludeColumns().iterator().next().getPattern());
+
+        schemaIterator = cdbImport.getReverseEngineering().getSchemas().iterator();
+        schema = schemaIterator.next();
+        assertEquals("schema-name-03", schema.getName());
+
+        schema = schemaIterator.next();
+        assertEquals("schema-name-04", schema.getName());
+
+        includeTableIterator = schema.getIncludeTables().iterator();
+        assertEquals("incTable-04", includeTableIterator.next().getPattern());
+        assertEquals("excTable-04", schema.getExcludeTables().iterator().next().getPattern());
+
+        includeTable = includeTableIterator.next();
+        assertEquals("incTable-05", includeTable.getPattern());
+        assertEquals("includeColumn-04", includeTable.getIncludeColumns().iterator().next().getPattern());
+        assertEquals("excludeColumn-04", includeTable.getExcludeColumns().iterator().next().getPattern());
+
+        assertEquals("includeColumn-04", schema.getIncludeColumns().iterator().next().getPattern());
+        assertEquals("excludeColumn-04", schema.getExcludeColumns().iterator().next().getPattern());
+
+        assertEquals("includeColumn-03", catalog.getIncludeColumns().iterator().next().getPattern());
+        assertEquals("excludeColumn-03", catalog.getExcludeColumns().iterator().next().getPattern());
+    }
+
+    private void test(String name) throws Exception {
 		DbImporterMojo cdbImport = getCdbImport("dbimport/" + name + "-pom.xml");
 		File mapFile = cdbImport.getMap();
 		File mapFileCopy = new File(mapFile.getParentFile(), "copy-" + mapFile.getName());
@@ -224,59 +296,6 @@ public class DbImporterMojoTest extends AbstractMojoTestCase {
 		}
 	}
 
-	public void testFilteringConfig() throws Exception {
-		DbImporterMojo cdbImport = getCdbImport("config/pom-01.xml");
-
-		assertEquals(2, cdbImport.getReverseEngineering().getCatalogs().size());
-		Iterator<Catalog> iterator = cdbImport.getReverseEngineering().getCatalogs().iterator();
-		assertEquals("catalog-name-01", iterator.next().getName());
-
-		Catalog catalog = iterator.next();
-		assertEquals("catalog-name-02", catalog.getName());
-		Iterator<Schema> schemaIterator = catalog.getSchemas().iterator();
-
-		assertEquals("schema-name-01", schemaIterator.next().getName());
-
-		Schema schema = schemaIterator.next();
-		assertEquals("schema-name-02", schema.getName());
-
-		Iterator<IncludeTable> includeTableIterator = schema.getIncludeTables().iterator();
-		assertEquals("incTable-01", includeTableIterator.next().getPattern());
-
-		IncludeTable includeTable = includeTableIterator.next();
-		assertEquals("incTable-02", includeTable.getPattern());
-		assertEquals("includeColumn-01", includeTable.getIncludeColumns().iterator().next().getPattern());
-		assertEquals("excludeColumn-01", includeTable.getExcludeColumns().iterator().next().getPattern());
-
-		assertEquals("includeColumn-02", schema.getIncludeColumns().iterator().next().getPattern());
-		assertEquals("excludeColumn-02", schema.getExcludeColumns().iterator().next().getPattern());
-
-		assertEquals("includeColumn-03", catalog.getIncludeColumns().iterator().next().getPattern());
-		assertEquals("excludeColumn-03", catalog.getExcludeColumns().iterator().next().getPattern());
-
-		schemaIterator = cdbImport.getReverseEngineering().getSchemas().iterator();
-		schema = schemaIterator.next();
-		assertEquals("schema-name-03", schema.getName());
-
-		schema = schemaIterator.next();
-		assertEquals("schema-name-04", schema.getName());
-
-		includeTableIterator = schema.getIncludeTables().iterator();
-		assertEquals("incTable-04", includeTableIterator.next().getPattern());
-		assertEquals("excTable-04", schema.getExcludeTables().iterator().next().getPattern());
-
-		includeTable = includeTableIterator.next();
-		assertEquals("incTable-05", includeTable.getPattern());
-		assertEquals("includeColumn-04", includeTable.getIncludeColumns().iterator().next().getPattern());
-		assertEquals("excludeColumn-04", includeTable.getExcludeColumns().iterator().next().getPattern());
-
-		assertEquals("includeColumn-04", schema.getIncludeColumns().iterator().next().getPattern());
-		assertEquals("excludeColumn-04", schema.getExcludeColumns().iterator().next().getPattern());
-
-		assertEquals("includeColumn-03", catalog.getIncludeColumns().iterator().next().getPattern());
-		assertEquals("excludeColumn-03", catalog.getExcludeColumns().iterator().next().getPattern());
-	}
-
 	private void prepareDatabase(String sqlFile, DbImportConfiguration dbImportConfiguration) throws Exception {
 
 		URL sqlUrl = ResourceUtil.getResource(getClass(), "dbimport/" + sqlFile + ".sql");

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/config/pom-skip-primary-key-loading.xml
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/config/pom-skip-primary-key-loading.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/config/pom-skip-primary-key-loading.xml
new file mode 100644
index 0000000..bd11c5f
--- /dev/null
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/config/pom-skip-primary-key-loading.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+	http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-cayenne-plugin</artifactId>
+                <configuration>
+                    <map>target/test/org/apache/cayenne/tools/dbimporter-map1.map.xml</map>
+
+                    <reverseEngineering>
+                        <skipPrimaryKeyLoading>true</skipPrimaryKeyLoading>
+                    </reverseEngineering>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipPrimaryKeyLoading-pom.xml
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipPrimaryKeyLoading-pom.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipPrimaryKeyLoading-pom.xml
new file mode 100644
index 0000000..5b78108
--- /dev/null
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipPrimaryKeyLoading-pom.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+	http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+	<name>DbImporterMojo Test1</name>	
+
+	<build>
+		<plugins>
+			<plugin>
+				<artifactId>maven-cayenne-plugin</artifactId>
+				<configuration>
+					<map>target/test-classes/org/apache/cayenne/tools/dbimport/testSkipPrimaryKeyLoading.map.xml</map>
+                    <driver>org.apache.derby.jdbc.EmbeddedDriver</driver>
+                    <url>jdbc:derby:memory:DbImporterMojoTest;create=true</url>
+
+                    <reverseEngineering>
+                        <skipPrimaryKeyLoading>true</skipPrimaryKeyLoading>
+                    </reverseEngineering>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+
+</project>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipPrimaryKeyLoading.map.xml
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipPrimaryKeyLoading.map.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipPrimaryKeyLoading.map.xml
new file mode 100644
index 0000000..a1e533f
--- /dev/null
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipPrimaryKeyLoading.map.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  -->
+<data-map xmlns="http://cayenne.apache.org/schema/7/modelMap"
+	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/7/modelMap http://cayenne.apache.org/schema/7/modelMap.xsd"
+	 project-version="7">
+    <property name="defaultPackage" value="com.my.home"/>
+    <db-entity name="A" schema="APP">
+        <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+    </db-entity>
+    <db-entity name="B" schema="APP">
+        <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+    </db-entity>
+    <obj-entity name="A" className="A" dbEntityName="A">
+    </obj-entity>
+    <obj-entity name="B" className="B" dbEntityName="B">
+    </obj-entity>
+</data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipPrimaryKeyLoading.map.xml-result
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipPrimaryKeyLoading.map.xml-result b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipPrimaryKeyLoading.map.xml-result
new file mode 100644
index 0000000..deac3cd
--- /dev/null
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipPrimaryKeyLoading.map.xml-result
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  -->
+<data-map xmlns="http://cayenne.apache.org/schema/7/modelMap"
+	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/7/modelMap http://cayenne.apache.org/schema/7/modelMap.xsd"
+	 project-version="7">
+    <property name="defaultPackage" value="com.my.home"/>
+    <db-entity name="A" schema="APP">
+        <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+    </db-entity>
+    <db-entity name="B" schema="APP">
+        <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+    </db-entity>
+    <db-entity name="C" schema="APP">
+		<db-attribute name="ID" type="INTEGER" isMandatory="true" length="10"/>
+    </db-entity>
+    <obj-entity name="A" className="A" dbEntityName="A">
+    </obj-entity>
+    <obj-entity name="B" className="B" dbEntityName="B">
+    </obj-entity>
+	<obj-entity name="C" className="com.my.home.C" dbEntityName="C">
+		<obj-attribute name="id" type="java.lang.Integer" db-attribute-path="ID"/>
+    </obj-entity>
+</data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipPrimaryKeyLoading.sql
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipPrimaryKeyLoading.sql b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipPrimaryKeyLoading.sql
new file mode 100644
index 0000000..4bf663c
--- /dev/null
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipPrimaryKeyLoading.sql
@@ -0,0 +1,30 @@
+--  Licensed to the Apache Software Foundation (ASF) under one
+--  or more contributor license agreements.  See the NOTICE file
+--  distributed with this work for additional information
+-- regarding copyright ownership.  The ASF licenses this file
+--  to you under the Apache License, Version 2.0 (the
+--  "License"); you may not use this file except in compliance
+--  with the License.  You may obtain a copy of the License at
+--
+--    http://www.apache.org/licenses/LICENSE-2.0
+--
+--  Unless required by applicable law or agreed to in writing,
+--  software distributed under the License is distributed on an
+--  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+--  KIND, either express or implied.  See the License for the
+--  specific language governing permissions and limitations
+--  under the License.
+
+CREATE TABLE APP.A (
+  id INTEGER NOT NULL,
+
+  PRIMARY KEY (id)
+);
+
+CREATE TABLE APP.B (
+  id INTEGER NOT NULL
+);
+
+CREATE TABLE APP.C (
+  id INTEGER NOT NULL
+);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipRelationshipsLoading.map.xml
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipRelationshipsLoading.map.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipRelationshipsLoading.map.xml
new file mode 100644
index 0000000..a18b3f3
--- /dev/null
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipRelationshipsLoading.map.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  -->
+<data-map xmlns="http://cayenne.apache.org/schema/7/modelMap"
+	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/7/modelMap http://cayenne.apache.org/schema/7/modelMap.xsd"
+	 project-version="7">
+    <property name="defaultPackage" value="com.my.home"/>
+    <db-entity name="A" schema="APP">
+        <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+    </db-entity>
+    <db-entity name="A_B" schema="APP">
+        <db-attribute name="A_ID" type="INTEGER" isMandatory="true" length="10"/>
+        <db-attribute name="B_ID" type="INTEGER" isMandatory="true" length="10"/>
+    </db-entity>
+    <db-entity name="B" schema="APP">
+        <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+    </db-entity>
+    <obj-entity name="A" className="A" dbEntityName="A">
+    </obj-entity>
+    <obj-entity name="AB" className="AB" dbEntityName="A_B">
+    </obj-entity>
+    <obj-entity name="B" className="B" dbEntityName="B">
+    </obj-entity>
+    <db-relationship name="aBArray" source="A" target="A_B" toMany="true">
+        <db-attribute-pair source="ID" target="A_ID"/>
+    </db-relationship>
+    <db-relationship name="toA" source="A_B" target="A" toMany="false">
+        <db-attribute-pair source="A_ID" target="ID"/>
+    </db-relationship>
+    <db-relationship name="toB" source="A_B" target="B" toMany="false">
+        <db-attribute-pair source="B_ID" target="ID"/>
+    </db-relationship>
+    <db-relationship name="aBArray" source="B" target="A_B" toMany="true">
+        <db-attribute-pair source="ID" target="B_ID"/>
+    </db-relationship>
+    <obj-relationship name="toA" source="AB" target="A" deleteRule="Nullify" db-relationship-path="toA"/>
+    <obj-relationship name="aBArray" source="B" target="AB" deleteRule="Deny" db-relationship-path="aBArray"/>
+</data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipRelationshipsLoading.map.xml-result
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipRelationshipsLoading.map.xml-result b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipRelationshipsLoading.map.xml-result
index af9ea36..a18b3f3 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipRelationshipsLoading.map.xml-result
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipRelationshipsLoading.map.xml-result
@@ -1,36 +1,55 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
 
-    http://www.apache.org/licenses/LICENSE-2.0
+  http://www.apache.org/licenses/LICENSE-2.0
 
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
--->
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  -->
 <data-map xmlns="http://cayenne.apache.org/schema/7/modelMap"
-          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-          xsi:schemaLocation="http://cayenne.apache.org/schema/7/modelMap http://cayenne.apache.org/schema/7/modelMap.xsd"
-          project-version="7">
-    <db-entity name="CHILD" schema="APP">
+	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/7/modelMap http://cayenne.apache.org/schema/7/modelMap.xsd"
+	 project-version="7">
+    <property name="defaultPackage" value="com.my.home"/>
+    <db-entity name="A" schema="APP">
         <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
-        <db-attribute name="PARENT_ID" type="INTEGER" length="10"/>
     </db-entity>
-    <db-entity name="PARENT" schema="APP">
+    <db-entity name="A_B" schema="APP">
+        <db-attribute name="A_ID" type="INTEGER" isMandatory="true" length="10"/>
+        <db-attribute name="B_ID" type="INTEGER" isMandatory="true" length="10"/>
+    </db-entity>
+    <db-entity name="B" schema="APP">
         <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
     </db-entity>
-    <obj-entity name="Child" className="Child" dbEntityName="CHILD">
-        <obj-attribute name="parentId" type="java.lang.Integer" db-attribute-path="PARENT_ID"/>
+    <obj-entity name="A" className="A" dbEntityName="A">
+    </obj-entity>
+    <obj-entity name="AB" className="AB" dbEntityName="A_B">
     </obj-entity>
-    <obj-entity name="Parent" className="Parent" dbEntityName="PARENT">
+    <obj-entity name="B" className="B" dbEntityName="B">
     </obj-entity>
+    <db-relationship name="aBArray" source="A" target="A_B" toMany="true">
+        <db-attribute-pair source="ID" target="A_ID"/>
+    </db-relationship>
+    <db-relationship name="toA" source="A_B" target="A" toMany="false">
+        <db-attribute-pair source="A_ID" target="ID"/>
+    </db-relationship>
+    <db-relationship name="toB" source="A_B" target="B" toMany="false">
+        <db-attribute-pair source="B_ID" target="ID"/>
+    </db-relationship>
+    <db-relationship name="aBArray" source="B" target="A_B" toMany="true">
+        <db-attribute-pair source="ID" target="B_ID"/>
+    </db-relationship>
+    <obj-relationship name="toA" source="AB" target="A" deleteRule="Nullify" db-relationship-path="toA"/>
+    <obj-relationship name="aBArray" source="B" target="AB" deleteRule="Deny" db-relationship-path="aBArray"/>
 </data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/78558aaa/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipRelationshipsLoading.sql
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipRelationshipsLoading.sql b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipRelationshipsLoading.sql
index 2955a3a..0241d1d 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipRelationshipsLoading.sql
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testSkipRelationshipsLoading.sql
@@ -15,16 +15,22 @@
 --  specific language governing permissions and limitations
 --  under the License.
 
-CREATE TABLE APP.Parent (
+CREATE TABLE APP.A (
   id INTEGER NOT NULL,
 
   PRIMARY KEY (id)
 );
 
-CREATE TABLE APP.Child (
+CREATE TABLE APP.B (
   id INTEGER NOT NULL,
-  Parent_id INTEGER,
 
-  PRIMARY KEY (id),
-  CONSTRAINT PARENT_CHILD FOREIGN KEY (Parent_id) REFERENCES APP.Parent (id)
+  PRIMARY KEY (id)
+);
+
+CREATE TABLE APP.A_B (
+  A_ID INTEGER NOT NULL,
+  B_ID INTEGER NOT NULL,
+
+  CONSTRAINT A_B_A FOREIGN KEY (A_ID) REFERENCES APP.A (ID),
+  CONSTRAINT A_B_B FOREIGN KEY (B_ID) REFERENCES APP.B (ID)
 );
\ No newline at end of file