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 <[email protected]> Authored: Wed Dec 21 18:44:35 2016 +0300 Committer: Nikita Timofeev <[email protected]> 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>
