You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by sk...@apache.org on 2016/12/22 11:04:58 UTC

[1/4] cayenne git commit: CAY-2177 Sync auto generated state of PK between model and DB Status of databases that support auto generated keys feature - tested on: DB2, MySQL, Postgres, H2, Derby - not tested on: sqlite and SQLServer Additional changes:

Repository: cayenne
Updated Branches:
  refs/heads/master d01cc37aa -> c32288d51


CAY-2177 Sync auto generated state of PK between model and DB
Status of databases that support auto generated keys feature
 - tested on: DB2, MySQL, Postgres, H2, Derby
 - not tested on: sqlite and SQLServer
Additional changes:
 - new version for derby dependency
 - turn on support for auto-generated columns in HSQLDB


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

Branch: refs/heads/master
Commit: d6d4251647bbafe202ebbda5b2d7c8fa19311ec2
Parents: d01cc37
Author: Nikita Timofeev <st...@gmail.com>
Authored: Wed Dec 21 18:44:35 2016 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Wed Dec 21 18:44:35 2016 +0300

----------------------------------------------------------------------
 .../cayenne/dbsync/merge/DbAttributeMerger.java |   2 +-
 .../merge/factory/DB2MergerTokenFactory.java    |  22 +++
 .../factory/DefaultMergerTokenFactory.java      |  12 ++
 .../merge/factory/DerbyMergerTokenFactory.java  |  20 +++
 .../merge/factory/H2MergerTokenFactory.java     |  25 +++
 .../merge/factory/HSQLMergerTokenFactory.java   |  20 +++
 .../merge/factory/IngresMergerTokenFactory.java |  21 +++
 .../merge/factory/MergerTokenFactory.java       |   4 +
 .../merge/factory/MySQLMergerTokenFactory.java  |  28 ++++
 .../factory/PostgresMergerTokenFactory.java     |  21 +++
 .../factory/SQLServerMergerTokenFactory.java    |  21 +++
 .../merge/token/db/AddRelationshipToDb.java     |   2 +-
 .../merge/token/db/SetGeneratedFlagToDb.java    |  88 ++++++++++
 .../token/model/AddRelationshipToModel.java     |   2 +-
 .../token/model/SetGeneratedFlagToModel.java    |  51 ++++++
 .../merge/token/db/SetGeneratedFlagToDbIT.java  | 161 +++++++++++++++++++
 .../token/model/SetGeneratedFlagToModelIT.java  |  67 ++++++++
 .../cayenne/dba/hsqldb/HSQLDBAdapter.java       |   5 +
 .../apache/cayenne/unit/DB2UnitDbAdapter.java   |  10 ++
 .../apache/cayenne/unit/H2UnitDbAdapter.java    |   4 +
 .../cayenne/unit/HSQLDBUnitDbAdapter.java       |  10 ++
 .../apache/cayenne/unit/MySQLUnitDbAdapter.java |  10 ++
 .../cayenne/unit/PostgresUnitDbAdapter.java     |   5 +
 .../org/apache/cayenne/unit/UnitDbAdapter.java  |  14 +-
 pom.xml                                         |   2 +-
 25 files changed, 622 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbAttributeMerger.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbAttributeMerger.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbAttributeMerger.java
index 5c37489..0ee74b3 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbAttributeMerger.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbAttributeMerger.java
@@ -158,7 +158,7 @@ class DbAttributeMerger extends AbstractMerger<DbEntity, DbAttribute> {
             return;
         }
 
-
+        tokens.add(getTokenFactory().createSetGeneratedFlagToDb(original.getEntity(), original, original.isGenerated()));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DB2MergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DB2MergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DB2MergerTokenFactory.java
index 04669f0..83a43d0 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DB2MergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DB2MergerTokenFactory.java
@@ -18,9 +18,11 @@
  ****************************************************************/
 package org.apache.cayenne.dbsync.merge.factory;
 
+import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
 import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetGeneratedFlagToDb;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 
@@ -44,4 +46,24 @@ public class DB2MergerTokenFactory extends DefaultMergerTokenFactory {
             }
         };
     }
+
+    @Override
+    public MergerToken createSetGeneratedFlagToDb(DbEntity entity, DbAttribute column, boolean isGenerated) {
+        return new SetGeneratedFlagToDb(entity, column, isGenerated) {
+            @Override
+            protected void appendAutoIncrement(DbAdapter adapter, StringBuffer builder) {
+                builder.append("SET GENERATED BY DEFAULT AS IDENTITY");
+            }
+
+            @Override
+            protected void appendDropAutoIncrement(DbAdapter adapter, StringBuffer builder) {
+                builder.append("DROP IDENTITY");
+            }
+
+            @Override
+            public boolean isEmpty() {
+                return false;
+            }
+        };
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DefaultMergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DefaultMergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DefaultMergerTokenFactory.java
index 54132f1..4fce6bf 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DefaultMergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DefaultMergerTokenFactory.java
@@ -28,6 +28,7 @@ import org.apache.cayenne.dbsync.merge.token.db.DropRelationshipToDb;
 import org.apache.cayenne.dbsync.merge.token.db.DropTableToDb;
 import org.apache.cayenne.dbsync.merge.token.db.SetAllowNullToDb;
 import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetGeneratedFlagToDb;
 import org.apache.cayenne.dbsync.merge.token.db.SetNotNullToDb;
 import org.apache.cayenne.dbsync.merge.token.db.SetPrimaryKeyToDb;
 import org.apache.cayenne.dbsync.merge.token.db.SetValueForNullToDb;
@@ -39,6 +40,7 @@ import org.apache.cayenne.dbsync.merge.token.model.DropRelationshipToModel;
 import org.apache.cayenne.dbsync.merge.token.model.DropTableToModel;
 import org.apache.cayenne.dbsync.merge.token.model.SetAllowNullToModel;
 import org.apache.cayenne.dbsync.merge.token.model.SetColumnTypeToModel;
+import org.apache.cayenne.dbsync.merge.token.model.SetGeneratedFlagToModel;
 import org.apache.cayenne.dbsync.merge.token.model.SetNotNullToModel;
 import org.apache.cayenne.dbsync.merge.token.model.SetPrimaryKeyToModel;
 import org.apache.cayenne.map.DbAttribute;
@@ -178,4 +180,14 @@ public class DefaultMergerTokenFactory implements MergerTokenFactory {
                 primaryKeyNew,
                 detectedPrimaryKeyName);
     }
+
+    @Override
+    public MergerToken createSetGeneratedFlagToDb(DbEntity entity, DbAttribute column, boolean isGenerated) {
+        return new SetGeneratedFlagToDb(entity, column, isGenerated);
+    }
+
+    @Override
+    public MergerToken createSetGeneratedFlagToModel(DbEntity entity, DbAttribute column, boolean isGenerated) {
+        return new SetGeneratedFlagToModel(entity, column, isGenerated);
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DerbyMergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DerbyMergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DerbyMergerTokenFactory.java
index b91234d..c8d5b1d 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DerbyMergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DerbyMergerTokenFactory.java
@@ -23,6 +23,7 @@ import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
 import org.apache.cayenne.dbsync.merge.token.db.SetAllowNullToDb;
 import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetGeneratedFlagToDb;
 import org.apache.cayenne.dbsync.merge.token.db.SetNotNullToDb;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
@@ -82,4 +83,23 @@ public class DerbyMergerTokenFactory extends DefaultMergerTokenFactory {
         };
     }
 
+    @Override
+    public MergerToken createSetGeneratedFlagToDb(DbEntity entity, DbAttribute column, boolean isGenerated) {
+        return new SetGeneratedFlagToDb(entity, column, isGenerated) {
+            @Override
+            protected void appendAutoIncrement(DbAdapter adapter, StringBuffer builder) {
+                throw new UnsupportedOperationException("Can't automatically alter column to identity. You need to manually alter schema.");
+            }
+
+            @Override
+            protected void appendDropAutoIncrement(DbAdapter adapter, StringBuffer builder) {
+                throw new UnsupportedOperationException("Can't automatically drop identity. You need to manually alter schema.");
+            }
+
+            @Override
+            public boolean isEmpty() {
+                return false;
+            }
+        };
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/H2MergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/H2MergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/H2MergerTokenFactory.java
index c2d0e5f..f920048 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/H2MergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/H2MergerTokenFactory.java
@@ -24,6 +24,7 @@ import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
 import org.apache.cayenne.dbsync.merge.token.db.SetAllowNullToDb;
 import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetGeneratedFlagToDb;
 import org.apache.cayenne.dbsync.merge.token.db.SetPrimaryKeyToDb;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
@@ -79,4 +80,28 @@ public class H2MergerTokenFactory extends DefaultMergerTokenFactory {
 
         };
     }
+
+    @Override
+    public MergerToken createSetGeneratedFlagToDb(DbEntity entity, DbAttribute column, boolean isGenerated) {
+        return new SetGeneratedFlagToDb(entity, column, isGenerated) {
+            protected void appendAlterColumnClause(DbAdapter adapter, StringBuffer builder) {
+                builder.append(" ALTER COLUMN ");
+            }
+
+            @Override
+            protected void appendAutoIncrement(DbAdapter adapter, StringBuffer builder) {
+                adapter.createTableAppendColumn(builder, this.getColumn());
+            }
+
+            @Override
+            protected void appendDropAutoIncrement(DbAdapter adapter, StringBuffer builder) {
+                throw new UnsupportedOperationException("Can't automatically drop AUTO_INCREMENT in H2 database. You should do this manually.");
+            }
+
+            @Override
+            public boolean isEmpty() {
+                return false;
+            }
+        };
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/HSQLMergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/HSQLMergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/HSQLMergerTokenFactory.java
index 5816871..b6aa565 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/HSQLMergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/HSQLMergerTokenFactory.java
@@ -23,6 +23,7 @@ import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
 import org.apache.cayenne.dbsync.merge.token.db.SetAllowNullToDb;
 import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetGeneratedFlagToDb;
 import org.apache.cayenne.dbsync.merge.token.db.SetPrimaryKeyToDb;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
@@ -79,4 +80,23 @@ public class HSQLMergerTokenFactory extends DefaultMergerTokenFactory {
         };
     }
 
+    @Override
+    public MergerToken createSetGeneratedFlagToDb(DbEntity entity, DbAttribute column, boolean isGenerated) {
+        return new SetGeneratedFlagToDb(entity, column, isGenerated) {
+            @Override
+            protected void appendAutoIncrement(DbAdapter adapter, StringBuffer builder) {
+                builder.append("GENERATED BY DEFAULT AS IDENTITY (START WITH 1)");
+            }
+
+            @Override
+            protected void appendDropAutoIncrement(DbAdapter adapter, StringBuffer builder) {
+                builder.append("DROP IDENTITY");
+            }
+
+            @Override
+            public boolean isEmpty() {
+                return false;
+            }
+        };
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/IngresMergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/IngresMergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/IngresMergerTokenFactory.java
index 89e329b..512d53b 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/IngresMergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/IngresMergerTokenFactory.java
@@ -26,6 +26,7 @@ import org.apache.cayenne.dbsync.merge.token.db.DropColumnToDb;
 import org.apache.cayenne.dbsync.merge.token.db.DropRelationshipToDb;
 import org.apache.cayenne.dbsync.merge.token.db.SetAllowNullToDb;
 import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetGeneratedFlagToDb;
 import org.apache.cayenne.dbsync.merge.token.db.SetNotNullToDb;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
@@ -221,4 +222,24 @@ public class IngresMergerTokenFactory extends DefaultMergerTokenFactory {
             }
         };
     }
+
+    @Override
+    public MergerToken createSetGeneratedFlagToDb(DbEntity entity, DbAttribute column, boolean isGenerated) {
+        return new SetGeneratedFlagToDb(entity, column, isGenerated) {
+            @Override
+            protected void appendAutoIncrement(DbAdapter adapter, StringBuffer builder) {
+                throw new UnsupportedOperationException("Can't automatically alter column to IDENTITY in Ingres database. You should do this manually.");
+            }
+
+            @Override
+            protected void appendDropAutoIncrement(DbAdapter adapter, StringBuffer builder) {
+                builder.append("DROP IDENTITY");
+            }
+
+            @Override
+            public boolean isEmpty() {
+                return false;
+            }
+        };
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MergerTokenFactory.java
index c61f1ed..86ebf71 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MergerTokenFactory.java
@@ -85,4 +85,8 @@ public interface MergerTokenFactory {
             Collection<DbAttribute> primaryKeyOriginal,
             Collection<DbAttribute> primaryKeyNew,
             String detectedPrimaryKeyName);
+
+    MergerToken createSetGeneratedFlagToDb(DbEntity entity, DbAttribute column, boolean isGenerated);
+
+    MergerToken createSetGeneratedFlagToModel(DbEntity entity, DbAttribute column, boolean isGenerated);
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MySQLMergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MySQLMergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MySQLMergerTokenFactory.java
index ad49bc0..0321710 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MySQLMergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MySQLMergerTokenFactory.java
@@ -24,6 +24,7 @@ import org.apache.cayenne.dbsync.merge.token.MergerToken;
 import org.apache.cayenne.dbsync.merge.token.db.DropRelationshipToDb;
 import org.apache.cayenne.dbsync.merge.token.db.SetAllowNullToDb;
 import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetGeneratedFlagToDb;
 import org.apache.cayenne.dbsync.merge.token.db.SetNotNullToDb;
 import org.apache.cayenne.dbsync.merge.token.db.SetPrimaryKeyToDb;
 import org.apache.cayenne.map.DbAttribute;
@@ -153,4 +154,31 @@ public class MySQLMergerTokenFactory extends DefaultMergerTokenFactory {
 
         };
     }
+
+    @Override
+    public MergerToken createSetGeneratedFlagToDb(DbEntity entity, DbAttribute column, boolean isGenerated) {
+        return new SetGeneratedFlagToDb(entity, column, isGenerated) {
+            protected void appendAlterColumnClause(DbAdapter adapter, StringBuffer builder) {
+                builder.append(" MODIFY ");
+            }
+
+            @Override
+            protected void appendAutoIncrement(DbAdapter adapter, StringBuffer builder) {
+                adapter.createTableAppendColumn(builder, this.getColumn());
+            }
+
+            /**
+             * To drop AUTO_INCREMENT flag update column with all information but w/o AUTO_INCREMENT
+             */
+            @Override
+            protected void appendDropAutoIncrement(DbAdapter adapter, StringBuffer builder) {
+                adapter.createTableAppendColumn(builder, this.getColumn());
+            }
+
+            @Override
+            public boolean isEmpty() {
+                return false;
+            }
+        };
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/PostgresMergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/PostgresMergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/PostgresMergerTokenFactory.java
index c85cfdf..9bf6f97 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/PostgresMergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/PostgresMergerTokenFactory.java
@@ -18,9 +18,11 @@
  ****************************************************************/
 package org.apache.cayenne.dbsync.merge.factory;
 
+import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
 import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetGeneratedFlagToDb;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 
@@ -46,4 +48,23 @@ public class PostgresMergerTokenFactory extends DefaultMergerTokenFactory {
         };
     }
 
+    @Override
+    public MergerToken createSetGeneratedFlagToDb(DbEntity entity, DbAttribute column, boolean isGenerated) {
+        return new SetGeneratedFlagToDb(entity, column, isGenerated) {
+            @Override
+            protected void appendAutoIncrement(DbAdapter adapter, StringBuffer builder) {
+                throw new UnsupportedOperationException("Can't automatically create new SERIAL in Postgres database. You should do this manually.");
+            }
+
+            @Override
+            protected void appendDropAutoIncrement(DbAdapter adapter, StringBuffer builder) {
+                builder.append("SET DEFAULT NULL");
+            }
+
+            @Override
+            public boolean isEmpty() {
+                return false;
+            }
+        };
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/SQLServerMergerTokenFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/SQLServerMergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/SQLServerMergerTokenFactory.java
index a15558d..a70bcb0 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/SQLServerMergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/SQLServerMergerTokenFactory.java
@@ -24,6 +24,7 @@ import org.apache.cayenne.dbsync.merge.token.MergerToken;
 import org.apache.cayenne.dbsync.merge.token.db.AddColumnToDb;
 import org.apache.cayenne.dbsync.merge.token.db.SetAllowNullToDb;
 import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
+import org.apache.cayenne.dbsync.merge.token.db.SetGeneratedFlagToDb;
 import org.apache.cayenne.dbsync.merge.token.db.SetNotNullToDb;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
@@ -109,4 +110,24 @@ public class SQLServerMergerTokenFactory extends DefaultMergerTokenFactory {
 
         };
     }
+
+    @Override
+    public MergerToken createSetGeneratedFlagToDb(DbEntity entity, DbAttribute column, boolean isGenerated) {
+        return new SetGeneratedFlagToDb(entity, column, isGenerated) {
+            @Override
+            protected void appendAutoIncrement(DbAdapter adapter, StringBuffer builder) {
+                throw new UnsupportedOperationException("Can't automatically alter column to IDENTITY in SQLServer database. You should do this manually.");
+            }
+
+            @Override
+            protected void appendDropAutoIncrement(DbAdapter adapter, StringBuffer builder) {
+                throw new UnsupportedOperationException("Can't automatically alter column to drop IDENTITY in SQLServer database. You should do this manually.");
+            }
+
+            @Override
+            public boolean isEmpty() {
+                return false;
+            }
+        };
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AddRelationshipToDb.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AddRelationshipToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AddRelationshipToDb.java
index 3959bd5..df40e4b 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AddRelationshipToDb.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AddRelationshipToDb.java
@@ -34,7 +34,7 @@ public class AddRelationshipToDb extends AbstractToDbToken.Entity {
     private DbRelationship relationship;
 
     public AddRelationshipToDb(DbEntity entity, DbRelationship relationship) {
-        super("Add foreign key", 110, entity);
+        super("Add foreign key", 120, entity);
         this.relationship = relationship;
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetGeneratedFlagToDb.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetGeneratedFlagToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetGeneratedFlagToDb.java
new file mode 100644
index 0000000..4ea3313
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetGeneratedFlagToDb.java
@@ -0,0 +1,88 @@
+/*****************************************************************
+ *   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.dbsync.merge.token.db;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dba.QuotingStrategy;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
+import org.apache.cayenne.dbsync.merge.token.MergerToken;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+
+/**
+ * @since 4.0
+ */
+public class SetGeneratedFlagToDb extends AbstractToDbToken.EntityAndColumn {
+
+    private final boolean isGenerated;
+
+    public SetGeneratedFlagToDb(DbEntity entity, DbAttribute column, boolean isGenerated) {
+        // drop generated attribute must go first
+        super("Set Is Generated", isGenerated ? 111 : 109, entity, column);
+        this.isGenerated = isGenerated;
+    }
+
+    @Override
+    public MergerToken createReverse(MergerTokenFactory factory) {
+        return factory.createSetGeneratedFlagToModel(getEntity(), getColumn(), !isGenerated);
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return true;
+    }
+
+    protected void appendAutoIncrement(DbAdapter adapter, StringBuffer builder) {
+        throw new UnsupportedOperationException("Not supported on generic DB");
+    }
+
+    protected void appendDropAutoIncrement(DbAdapter adapter, StringBuffer builder) {
+        throw new UnsupportedOperationException("Not supported on generic DB");
+    }
+
+    protected void appendAlterColumnClause(DbAdapter adapter, StringBuffer builder) {
+        QuotingStrategy context = adapter.getQuotingStrategy();
+        builder.append(" ALTER COLUMN ").append(context.quotedName(getColumn())).append(" ");
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public List<String> createSql(DbAdapter adapter) {
+        if(!adapter.supportsGeneratedKeys()) {
+            return (List<String>)Collections.EMPTY_LIST;
+        }
+
+        QuotingStrategy context = adapter.getQuotingStrategy();
+
+        StringBuffer builder = new StringBuffer();
+        builder.append("ALTER TABLE ").append(context.quotedFullyQualifiedName(getEntity()));
+        appendAlterColumnClause(adapter, builder);
+        if(isGenerated) {
+            appendAutoIncrement(adapter, builder);
+        } else {
+            appendDropAutoIncrement(adapter, builder);
+        }
+
+        return Collections.singletonList(builder.toString());
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddRelationshipToModel.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddRelationshipToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddRelationshipToModel.java
index 9202bd5..659e286 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddRelationshipToModel.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddRelationshipToModel.java
@@ -35,7 +35,7 @@ public class AddRelationshipToModel extends AbstractToModelToken.Entity {
     private DbRelationship relationship;
 
     public AddRelationshipToModel(DbEntity entity, DbRelationship relationship) {
-        super("Add Relationship", 115, entity);
+        super("Add Relationship", 125, entity);
         this.relationship = relationship;
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/SetGeneratedFlagToModel.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/SetGeneratedFlagToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/SetGeneratedFlagToModel.java
new file mode 100644
index 0000000..4a67917
--- /dev/null
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/SetGeneratedFlagToModel.java
@@ -0,0 +1,51 @@
+/*****************************************************************
+ *   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.dbsync.merge.token.model;
+
+import org.apache.cayenne.dbsync.merge.context.MergerContext;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
+import org.apache.cayenne.dbsync.merge.token.MergerToken;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+
+/**
+ * @since 4.0
+ */
+public class SetGeneratedFlagToModel extends AbstractToModelToken.EntityAndColumn {
+
+    private final boolean isGenerated;
+
+    public SetGeneratedFlagToModel(DbEntity entity, DbAttribute column, boolean isGenerated) {
+        // drop generated attribute must go first
+        super("Set Is Generated", isGenerated ? 111 : 109, entity, column);
+        this.isGenerated = isGenerated;
+    }
+
+    @Override
+    public MergerToken createReverse(MergerTokenFactory factory) {
+        return factory.createSetGeneratedFlagToDb(getEntity(), getColumn(), !isGenerated);
+    }
+
+    @Override
+    public void execute(MergerContext context) {
+        getColumn().setGenerated(isGenerated);
+        context.getDelegate().dbAttributeModified(getColumn());
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/db/SetGeneratedFlagToDbIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/db/SetGeneratedFlagToDbIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/db/SetGeneratedFlagToDbIT.java
new file mode 100644
index 0000000..7a937a0
--- /dev/null
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/db/SetGeneratedFlagToDbIT.java
@@ -0,0 +1,161 @@
+/*****************************************************************
+ *   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.dbsync.merge.token.db;
+
+import java.sql.Types;
+import java.util.List;
+
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dbsync.merge.MergeCase;
+import org.apache.cayenne.dbsync.merge.token.MergerToken;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.unit.UnitDbAdapter;
+import org.junit.After;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+/**
+ * Test synchronization of generated keys to DB (SetGeneratedFlagToDB merge token)
+ *
+ * As there are not many DBMS that fully support create/alter/drop for generated columns
+ * this test has several actual paths of execution.
+ *
+ * 1. If DB has no support for generated values at all
+ * this test will check that no meaningful tokens are created in sync process
+ *
+ * 2. If DB can create generated columns but can't alter them
+ * this test will check that proper exception it thrown when applying token
+ *
+ * 3. If DB can alter generated columns then full check will be performed
+ * (here is actually two variants as some DB can only drop whereas some can only add generated attribute)
+ *
+ * @see DbAdapter#supportsGeneratedKeys()
+ * @see UnitDbAdapter#supportsGeneratedKeys()
+ * @see UnitDbAdapter#supportsGeneratedKeysAdd()
+ * @see UnitDbAdapter#supportsGeneratedKeysDrop()
+ *
+ * @since 4.0
+ */
+public class SetGeneratedFlagToDbIT extends MergeCase {
+
+    @Inject
+    UnitDbAdapter dbAdapter;
+
+    @Test
+    public void setGeneratedFlag() throws Exception {
+        DbEntity dbEntity = createTestTable(false);
+        assertNotNull(dbEntity);
+
+        DbAttribute attribute = dbEntity.getAttribute("ID");
+        assertNotNull(attribute);
+        assertFalse(attribute.isGenerated());
+
+        attribute.setGenerated(true);
+
+        List<MergerToken> tokens = createMergeTokens();
+        if(!dbAdapter.supportsGeneratedKeys()) {
+            assertEquals(0, tokens.size());
+            return;
+        }
+
+        assertEquals(1, tokens.size());
+        MergerToken token = tokens.get(0);
+        assertTrue(token instanceof SetGeneratedFlagToDb);
+
+        try {
+            execute(token);
+            if(!dbAdapter.supportsGeneratedKeysAdd()) {
+                fail("SetGeneratedFlagToDb should fail on current DB");
+            }
+        } catch (UnsupportedOperationException ignored) {
+            return;
+        }
+
+        assertTokensAndExecute(0, 0);
+    }
+
+    @Test
+    public void dropGeneratedFlag() throws Exception {
+
+        DbEntity dbEntity = createTestTable(true);
+        assertNotNull(dbEntity);
+
+        DbAttribute attribute = dbEntity.getAttribute("ID");
+        assertNotNull(attribute);
+        assertTrue(attribute.isGenerated());
+
+        attribute.setGenerated(false);
+
+        List<MergerToken> tokens = createMergeTokens();
+        if(!dbAdapter.supportsGeneratedKeys()) {
+            assertEquals(0, tokens.size());
+            return;
+        }
+
+        assertEquals(1, tokens.size());
+
+        MergerToken token = tokens.get(0);
+        assertTrue(token instanceof SetGeneratedFlagToDb);
+
+        try {
+            execute(token);
+            if(!dbAdapter.supportsGeneratedKeysDrop()) {
+                fail("SetGeneratedFlagToDb should fail on current DB");
+            }
+        } catch (UnsupportedOperationException ignored) {
+            return;
+        }
+
+        assertTokensAndExecute(0, 0);
+    }
+
+    private DbEntity createTestTable(boolean generated) throws Exception {
+        dropTestTables();
+
+        DbEntity withGenKey = new DbEntity("NEW_TABLE");
+        DbAttribute attribute = new DbAttribute("ID", Types.INTEGER, withGenKey);
+        attribute.setMandatory(true);
+        attribute.setPrimaryKey(true);
+        attribute.setGenerated(generated);
+        withGenKey.addAttribute(attribute);
+        map.addDbEntity(withGenKey);
+
+        assertTokensAndExecute(1, 0);
+        assertTokensAndExecute(0, 0);
+
+        return withGenKey;
+    }
+
+    @After
+    public void dropTestTables() throws Exception {
+        if(map.getDbEntity("NEW_TABLE") != null) {
+            map.removeDbEntity("NEW_TABLE");
+        }
+        dropTableIfPresent("NEW_TABLE");
+        assertTokensAndExecute(0, 0);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/model/SetGeneratedFlagToModelIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/model/SetGeneratedFlagToModelIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/model/SetGeneratedFlagToModelIT.java
new file mode 100644
index 0000000..2a29745
--- /dev/null
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/model/SetGeneratedFlagToModelIT.java
@@ -0,0 +1,67 @@
+/*****************************************************************
+ *   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.dbsync.merge.token.model;
+
+import java.util.List;
+
+import org.apache.cayenne.dbsync.merge.MergeCase;
+import org.apache.cayenne.dbsync.merge.token.MergerToken;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * @since 4.0
+ */
+public class SetGeneratedFlagToModelIT extends MergeCase {
+
+    @Test
+    public void test() throws Exception {
+        DbEntity dbEntity = map.getDbEntity("PAINTING");
+        assertNotNull(dbEntity);
+
+        DbAttribute attribute = dbEntity.getAttribute("PAINTING_ID");
+        assertNotNull(attribute);
+        assertFalse(attribute.isGenerated());
+
+        attribute.setGenerated(true);
+
+        List<MergerToken> tokens = createMergeTokens();
+        assertEquals(1, tokens.size());
+
+        MergerToken token = tokens.get(0);
+        if (token.getDirection().isToDb()) {
+            token = token.createReverse(mergerFactory());
+        }
+        assertTrue(token instanceof SetGeneratedFlagToModel);
+
+        execute(token);
+
+        assertFalse(attribute.isGenerated());
+
+        assertTokensAndExecute(0, 0);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-server/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLDBAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLDBAdapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLDBAdapter.java
index d38a56a..314de60 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLDBAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLDBAdapter.java
@@ -74,6 +74,7 @@ public class HSQLDBAdapter extends JdbcAdapter {
 			@Inject(Constants.SERVER_TYPE_FACTORIES_LIST) List<ExtendedTypeFactory> extendedTypeFactories,
 			@Inject(Constants.SERVER_RESOURCE_LOCATOR) ResourceLocator resourceLocator) {
 		super(runtimeProperties, defaultExtendedTypes, userExtendedTypes, extendedTypeFactories, resourceLocator);
+		setSupportsGeneratedKeys(true);
 	}
 
 	/**
@@ -266,5 +267,9 @@ public class HSQLDBAdapter extends JdbcAdapter {
 		} else {
 			super.createTableAppendColumn(sqlBuffer, column);
 		}
+
+		if(column.isGenerated()) {
+			sqlBuffer.append(" GENERATED BY DEFAULT AS IDENTITY (START WITH 1)");
+		}
 	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-server/src/test/java/org/apache/cayenne/unit/DB2UnitDbAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/DB2UnitDbAdapter.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/DB2UnitDbAdapter.java
index 28f86c8..f4fc4f1 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/DB2UnitDbAdapter.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/DB2UnitDbAdapter.java
@@ -53,4 +53,14 @@ public class DB2UnitDbAdapter extends UnitDbAdapter {
     public boolean supportsStoredProcedures() {
         return false;
     }
+
+    @Override
+    public boolean supportsGeneratedKeysDrop() {
+        return true;
+    }
+
+    @Override
+    public boolean supportsGeneratedKeysAdd() {
+        return true;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-server/src/test/java/org/apache/cayenne/unit/H2UnitDbAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/H2UnitDbAdapter.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/H2UnitDbAdapter.java
index 445cce6..2c4a195 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/H2UnitDbAdapter.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/H2UnitDbAdapter.java
@@ -38,4 +38,8 @@ public class H2UnitDbAdapter extends UnitDbAdapter {
         return false;
     }
 
+    @Override
+    public boolean supportsGeneratedKeysAdd() {
+        return true;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-server/src/test/java/org/apache/cayenne/unit/HSQLDBUnitDbAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/HSQLDBUnitDbAdapter.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/HSQLDBUnitDbAdapter.java
index 29b99fe..3691d03 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/HSQLDBUnitDbAdapter.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/HSQLDBUnitDbAdapter.java
@@ -71,4 +71,14 @@ public class HSQLDBUnitDbAdapter extends UnitDbAdapter {
         // HSQL is not locking AUTO_PK_TABLE, so running PkGenerator in parallel may result in conflicting ranges
         return false;
     }
+
+    @Override
+    public boolean supportsGeneratedKeysAdd() {
+        return true;
+    }
+
+    @Override
+    public boolean supportsGeneratedKeysDrop() {
+        return true;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-server/src/test/java/org/apache/cayenne/unit/MySQLUnitDbAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/MySQLUnitDbAdapter.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/MySQLUnitDbAdapter.java
index 2ada884..a3680a0 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/MySQLUnitDbAdapter.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/MySQLUnitDbAdapter.java
@@ -120,4 +120,14 @@ public class MySQLUnitDbAdapter extends UnitDbAdapter {
         // tables...
         return !NO_CONSTRAINTS_TABLES.contains(entity.getName());
     }
+
+    @Override
+    public boolean supportsGeneratedKeysAdd() {
+        return true;
+    }
+
+    @Override
+    public boolean supportsGeneratedKeysDrop() {
+        return true;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-server/src/test/java/org/apache/cayenne/unit/PostgresUnitDbAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/PostgresUnitDbAdapter.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/PostgresUnitDbAdapter.java
index 4042979..4182054 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/PostgresUnitDbAdapter.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/PostgresUnitDbAdapter.java
@@ -61,4 +61,9 @@ public class PostgresUnitDbAdapter extends UnitDbAdapter {
             executeDDL(con, "postgresql", "create-out-sp.sql");
         }
     }
+
+    @Override
+    public boolean supportsGeneratedKeysDrop() {
+        return true;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDbAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDbAdapter.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDbAdapter.java
index 6230943..2bf63e0 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDbAdapter.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDbAdapter.java
@@ -70,7 +70,7 @@ public class UnitDbAdapter {
     public boolean supportsPKGeneratorConcurrency() {
         return true;
     }
-    
+
     public String getIdentifiersStartQuote() {
         return "\"";
     }
@@ -354,4 +354,16 @@ public class UnitDbAdapter {
     public boolean supportsBoolean() {
         return true;
     }
+
+    public boolean supportsGeneratedKeys() {
+        return adapter.supportsGeneratedKeys();
+    }
+
+    public boolean supportsGeneratedKeysAdd() {
+        return false;
+    }
+
+    public boolean supportsGeneratedKeysDrop() {
+        return false;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d6d42516/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 711ca97..70fab88 100644
--- a/pom.xml
+++ b/pom.xml
@@ -476,7 +476,7 @@
 			<dependency>
             	<groupId>org.apache.derby</groupId>
             	<artifactId>derby</artifactId>
-            	<version>10.7.1.1</version>
+            	<version>10.13.1.1</version>
             	<scope>test</scope>
         	</dependency>
         	<dependency>


[4/4] cayenne git commit: Merge branch '167'

Posted by sk...@apache.org.
Merge branch '167'


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

Branch: refs/heads/master
Commit: c32288d510935fa4ae54b5c325125dd3b9b40b0c
Parents: d01cc37 89d37a5
Author: Savva Kolbachev <s....@gmail.com>
Authored: Thu Dec 22 14:04:32 2016 +0300
Committer: Savva Kolbachev <s....@gmail.com>
Committed: Thu Dec 22 14:04:32 2016 +0300

----------------------------------------------------------------------
 .../cayenne/dbsync/merge/DbAttributeMerger.java |   2 +-
 .../merge/factory/DB2MergerTokenFactory.java    |  22 +++
 .../factory/DefaultMergerTokenFactory.java      |  12 ++
 .../merge/factory/DerbyMergerTokenFactory.java  |  20 +++
 .../merge/factory/H2MergerTokenFactory.java     |  25 +++
 .../merge/factory/HSQLMergerTokenFactory.java   |  20 +++
 .../merge/factory/IngresMergerTokenFactory.java |  21 +++
 .../merge/factory/MergerTokenFactory.java       |   4 +
 .../merge/factory/MySQLMergerTokenFactory.java  |  28 ++++
 .../factory/PostgresMergerTokenFactory.java     |  21 +++
 .../factory/SQLServerMergerTokenFactory.java    |  21 +++
 .../merge/token/db/AddRelationshipToDb.java     |   2 +-
 .../merge/token/db/SetGeneratedFlagToDb.java    |  88 ++++++++++
 .../token/model/AddRelationshipToModel.java     |   2 +-
 .../token/model/SetGeneratedFlagToModel.java    |  51 ++++++
 .../merge/token/db/SetGeneratedFlagToDbIT.java  | 161 +++++++++++++++++++
 .../token/model/SetGeneratedFlagToModelIT.java  |  67 ++++++++
 .../cayenne/dba/hsqldb/HSQLDBAdapter.java       |   5 +
 .../apache/cayenne/unit/DB2UnitDbAdapter.java   |  10 ++
 .../apache/cayenne/unit/H2UnitDbAdapter.java    |   4 +
 .../cayenne/unit/HSQLDBUnitDbAdapter.java       |  10 ++
 .../apache/cayenne/unit/MySQLUnitDbAdapter.java |  10 ++
 .../cayenne/unit/PostgresUnitDbAdapter.java     |   5 +
 .../org/apache/cayenne/unit/UnitDbAdapter.java  |  14 +-
 docs/doc/src/main/resources/RELEASE-NOTES.txt   |   1 +
 pom.xml                                         |   2 +-
 26 files changed, 623 insertions(+), 5 deletions(-)
----------------------------------------------------------------------



[2/4] cayenne git commit: Apache Derby 10.13.x.x dropped support of Java 6 & 7 so use 10.12.x.x version.

Posted by sk...@apache.org.
Apache Derby 10.13.x.x dropped support of Java 6 & 7 so use 10.12.x.x version.


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

Branch: refs/heads/master
Commit: 2c8ac51df36846b3806dc5cd7fe7bb4046fcdf32
Parents: d6d4251
Author: stariy <st...@gmail.com>
Authored: Wed Dec 21 20:54:36 2016 +0300
Committer: stariy <st...@gmail.com>
Committed: Wed Dec 21 20:54:36 2016 +0300

----------------------------------------------------------------------
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/2c8ac51d/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 70fab88..152800c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -476,7 +476,7 @@
 			<dependency>
             	<groupId>org.apache.derby</groupId>
             	<artifactId>derby</artifactId>
-            	<version>10.13.1.1</version>
+            	<version>10.12.1.1</version>
             	<scope>test</scope>
         	</dependency>
         	<dependency>


[3/4] cayenne git commit: RELEASE-NOTES

Posted by sk...@apache.org.
RELEASE-NOTES


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

Branch: refs/heads/master
Commit: 89d37a51c2684070967d1fb22a68776e65cebf34
Parents: 2c8ac51
Author: Nikita Timofeev <st...@gmail.com>
Authored: Thu Dec 22 10:53:27 2016 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Thu Dec 22 10:53:27 2016 +0300

----------------------------------------------------------------------
 docs/doc/src/main/resources/RELEASE-NOTES.txt | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/89d37a51/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/RELEASE-NOTES.txt b/docs/doc/src/main/resources/RELEASE-NOTES.txt
index ac84187..753dae7 100644
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@ -23,6 +23,7 @@ CAY-2169 Split DbMerger to parts and clean it up
 CAY-2170 MergeToken sorting is highly unstable
 CAY-2172 Cleanup Modeler import and migrate db actions
 CAY-2176 Java 7 diamond class generation templates
+CAY-2177 Sync auto generated state of PK between model and DB
 
 Bug Fixes: