This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git


The following commit(s) were added to refs/heads/master by this push:
     new ad3a58b4a CAY-2987 DataNode to own PkGenerator
ad3a58b4a is described below

commit ad3a58b4a49e1643013573ca54e2bb676bee041b
Author: Andrus Adamchik <[email protected]>
AuthorDate: Sun Aug 16 11:58:33 2026 -0400

    CAY-2987 DataNode to own PkGenerator
---
 RELEASE-NOTES.txt                                  |   1 +
 UPGRADE.md                                         |   5 +
 .../merge/factory/DerbyMergerTokenFactory.java     |   9 +-
 .../merge/factory/FirebirdMergerTokenFactory.java  |  13 ++-
 .../dbsync/merge/factory/H2MergerTokenFactory.java |   3 +-
 .../merge/factory/HSQLMergerTokenFactory.java      |   5 +-
 .../merge/factory/IngresMergerTokenFactory.java    |  20 +++-
 .../merge/factory/MySQLMergerTokenFactory.java     |  13 ++-
 .../merge/factory/OracleMergerTokenFactory.java    |   9 +-
 .../merge/factory/SQLServerMergerTokenFactory.java |   9 +-
 .../merge/factory/SybaseMergerTokenFactory.java    |  15 ++-
 .../dbsync/merge/token/db/AbstractToDbToken.java   |   6 +-
 .../dbsync/merge/token/db/AddColumnToDb.java       |   5 +-
 .../dbsync/merge/token/db/AddProcedureToDb.java    |   4 +-
 .../dbsync/merge/token/db/AddRelationshipToDb.java |   5 +-
 .../dbsync/merge/token/db/CreateTableToDb.java     |  12 +--
 .../dbsync/merge/token/db/DropColumnToDb.java      |   5 +-
 .../dbsync/merge/token/db/DropProcedureToDb.java   |   4 +-
 .../merge/token/db/DropRelationshipToDb.java       |   5 +-
 .../dbsync/merge/token/db/DropTableToDb.java       |   8 +-
 .../dbsync/merge/token/db/SetAllowNullToDb.java    |   5 +-
 .../dbsync/merge/token/db/SetColumnTypeToDb.java   |   5 +-
 .../merge/token/db/SetGeneratedFlagToDb.java       |   5 +-
 .../dbsync/merge/token/db/SetNotNullToDb.java      |   5 +-
 .../dbsync/merge/token/db/SetPrimaryKeyToDb.java   |   5 +-
 .../dbsync/merge/token/db/SetValueForNullToDb.java |   4 +-
 .../dbsync/reverse/configuration/ToolsModule.java  |  37 +------
 .../reverse/dbimport/DefaultDbImportAction.java    |   2 +-
 .../org/apache/cayenne/dbsync/merge/MergeCase.java |   2 +-
 .../org/apache/cayenne/tools/DbGenerateTask.java   |   4 -
 .../java/org/apache/cayenne/access/DataNode.java   |  38 +++++++
 .../org/apache/cayenne/access/DbGenerator.java     |  22 ++--
 .../access/flush/PermanentObjectIdVisitor.java     |   2 +-
 .../cayenne/configuration/runtime/CoreModule.java  |  50 ---------
 .../configuration/runtime/CoreModuleExtender.java  |  27 -----
 .../runtime/DefaultDbAdapterFactory.java           |  19 +---
 .../runtime/PkGeneratorFactoryProvider.java        |  50 ---------
 .../java/org/apache/cayenne/dba/AutoAdapter.java   |  15 +--
 .../java/org/apache/cayenne/dba/DbAdapter.java     |  15 +--
 .../java/org/apache/cayenne/dba/JdbcAdapter.java   |  17 +--
 .../org/apache/cayenne/dba/JdbcPkGenerator.java    |  13 +--
 .../java/org/apache/cayenne/dba/PkGenerator.java   |   7 --
 .../apache/cayenne/dba/SequencePkGenerator.java    |   6 +-
 .../org/apache/cayenne/dba/db2/DB2Adapter.java     |   9 ++
 .../org/apache/cayenne/dba/db2/DB2PkGenerator.java |  12 +--
 .../org/apache/cayenne/dba/derby/DerbyAdapter.java |   9 ++
 .../apache/cayenne/dba/derby/DerbyPkGenerator.java |  10 +-
 .../cayenne/dba/frontbase/FrontBaseAdapter.java    |   9 ++
 .../dba/frontbase/FrontBasePkGenerator.java        |   8 --
 .../java/org/apache/cayenne/dba/h2/H2Adapter.java  |   9 ++
 .../org/apache/cayenne/dba/h2/H2PkGenerator.java   |  10 +-
 .../apache/cayenne/dba/ingres/IngresAdapter.java   |   9 ++
 .../cayenne/dba/ingres/IngresPkGenerator.java      |  10 +-
 .../org/apache/cayenne/dba/mysql/MySQLAdapter.java |   9 ++
 .../apache/cayenne/dba/mysql/MySQLPkGenerator.java |  10 +-
 .../apache/cayenne/dba/oracle/OracleAdapter.java   |   9 ++
 .../cayenne/dba/oracle/OraclePkGenerator.java      |  11 +-
 .../cayenne/dba/postgres/PostgresAdapter.java      |   9 ++
 .../cayenne/dba/postgres/PostgresPkGenerator.java  |  10 +-
 .../cayenne/dba/sqlserver/SQLServerAdapter.java    |   9 ++
 .../dba/sqlserver/SQLServerPkGenerator.java        |  10 +-
 .../apache/cayenne/dba/sybase/SybaseAdapter.java   |   9 ++
 .../cayenne/dba/sybase/SybasePkGenerator.java      |  10 +-
 .../java/org/apache/cayenne/PregeneratedPKIT.java  |   2 +-
 .../apache/cayenne/access/DataContextExtrasIT.java |  20 +---
 .../java/org/apache/cayenne/access/DataNodeIT.java |  84 ---------------
 .../apache/cayenne/access/DataNodeQueriesIT.java   |   4 +-
 .../org/apache/cayenne/access/DataNodeTest.java    | 114 +++++++++++++++++++++
 .../apache/cayenne/access/IdentityColumnsIT.java   |   2 +-
 .../org/apache/cayenne/access/MockDataNode.java    |   6 ++
 .../runtime/DefaultDbAdapterFactoryTest.java       |  10 --
 .../java/org/apache/cayenne/dba/AutoAdapterIT.java |   5 +-
 .../org/apache/cayenne/dba/JdbcPkGeneratorIT.java  |  36 +++----
 .../java/org/apache/cayenne/dba/PkGeneratorIT.java |   2 +-
 .../cayenne/dba/SequencePkGeneratorTest.java       |   3 +-
 .../org/apache/cayenne/unit/DbSchemaManager.java   |   4 +-
 .../modeler/ui/dbmerge/MergerOptionsDialog.java    |   7 +-
 77 files changed, 455 insertions(+), 546 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 117a6340e..a2d8ae33c 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -33,6 +33,7 @@ CAY-2983 CayenneDataSource: Public-facing DataSource builder
 CAY-2984 Remove "DataChannel" injectable dependency
 CAY-2985 DataDomain init and structure cleanup
 CAY-2986 Cgen to run unconditionally
+CAY-2987 DataNode to own PkGenerator
 
 Bug Fixes:
 
diff --git a/UPGRADE.md b/UPGRADE.md
index 15583e4a4..85cc8350c 100644
--- a/UPGRADE.md
+++ b/UPGRADE.md
@@ -117,6 +117,11 @@ DataMaps, filters and listeners can still be added (and 
removed) after creation.
   after project upgrades or when switching between machines and branches. 
Consequences:
   - The `force` flag is now a deprecated no-op — its former behavior is the 
only behavior.
 
+* Per [CAY-2987](https://issues.apache.org/jira/browse/CAY-2987), 
`PkGenerator` is now owned by `DataNode` rather than
+  by `DbAdapter`. A `DbAdapter` is only the source of the default generator 
for its database. This change is
+  entirely transparent unless you need to install a custom PkGenerator. You 
can do that via a custom injected 
+ `DefaultDataNodeFactory`, an explicit call to `dataNode.setPkGenerator(..)` 
or use a custom adapter.
+
 ## Upgrading to 5.0-M2
 
 * Per [CAY-2947](https://issues.apache.org/jira/browse/CAY-2947) the 
`cayenne-commitlog` artifact has been removed. Commit log support is now part 
of the
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 7ef273631..c0f42a856 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
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.dbsync.merge.factory;
 
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
@@ -60,7 +61,9 @@ public class DerbyMergerTokenFactory extends 
DefaultMergerTokenFactory {
         return new SetNotNullToDb(entity, column) {
 
             @Override
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
+                DbAdapter adapter = node.getAdapter();
+
                 QuotingStrategy quotes = 
adapter.getQuotingStrategy(getEntity());
                 StringBuilder sql = new StringBuilder("ALTER TABLE ");
                 quotes.appendFQN(sql, getEntity().getCatalog(), 
getEntity().getSchema(), getEntity().getName());
@@ -81,7 +84,9 @@ public class DerbyMergerTokenFactory extends 
DefaultMergerTokenFactory {
         return new SetAllowNullToDb(entity, column) {
 
             @Override
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
+                DbAdapter adapter = node.getAdapter();
+
                 QuotingStrategy quotes = 
adapter.getQuotingStrategy(getEntity());
                 StringBuilder sql = new StringBuilder("ALTER TABLE ");
                 quotes.appendFQN(sql, getEntity().getCatalog(), 
getEntity().getSchema(), getEntity().getName());
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/FirebirdMergerTokenFactory.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/FirebirdMergerTokenFactory.java
index 34a4adf58..477171863 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/FirebirdMergerTokenFactory.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/FirebirdMergerTokenFactory.java
@@ -19,6 +19,7 @@
  
 package org.apache.cayenne.dbsync.merge.factory;
 
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
@@ -37,7 +38,9 @@ public class FirebirdMergerTokenFactory extends 
DefaultMergerTokenFactory {
     @Override
     public MergerToken createDropColumnToDb(DbEntity entity, DbAttribute 
column) {
         return new DropColumnToDb(entity, column) {
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
+                DbAdapter adapter = node.getAdapter();
+
                 QuotingStrategy quotes = 
adapter.getQuotingStrategy(getEntity());
                 StringBuilder sql = new StringBuilder("ALTER TABLE ");
                 quotes.appendFQN(sql, getEntity().getCatalog(), 
getEntity().getSchema(), getEntity().getName());
@@ -53,7 +56,9 @@ public class FirebirdMergerTokenFactory extends 
DefaultMergerTokenFactory {
     @Override
     public MergerToken createSetNotNullToDb(DbEntity entity, DbAttribute 
column) {
         return new SetNotNullToDb(entity, column) {
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
+                DbAdapter adapter = node.getAdapter();
+
                 QuotingStrategy quotes = 
adapter.getQuotingStrategy(getEntity());
                 String entityName = quotes.quotedFQN(getEntity().getCatalog(), 
getEntity().getSchema(),
                         getEntity().getName());
@@ -69,7 +74,9 @@ public class FirebirdMergerTokenFactory extends 
DefaultMergerTokenFactory {
     @Override
     public MergerToken createSetAllowNullToDb(DbEntity entity, DbAttribute 
column) {
         return new SetAllowNullToDb(entity, column) {
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
+                DbAdapter adapter = node.getAdapter();
+
                 QuotingStrategy quotes = 
adapter.getQuotingStrategy(getEntity());
                 String entityName = quotes.quotedFQN(getEntity().getCatalog(), 
getEntity().getSchema(),
                         getEntity().getName());
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 45dfc2b26..fcaed1d50 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
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.dbsync.merge.factory;
 
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
@@ -61,7 +62,7 @@ public class H2MergerTokenFactory extends 
DefaultMergerTokenFactory {
         return new SetAllowNullToDb(entity, column) {
 
             @Override
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
                 return Collections.singletonList("ALTER TABLE " + 
getEntity().getFullyQualifiedName()
                         + " ALTER COLUMN " + getColumn().getName() + " SET 
NULL");
             }
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 7dc64181d..6128ddc1d 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
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.dbsync.merge.factory;
 
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
@@ -58,7 +59,9 @@ public class HSQLMergerTokenFactory extends 
DefaultMergerTokenFactory {
         return new SetAllowNullToDb(entity, column) {
 
             @Override
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
+                DbAdapter adapter = node.getAdapter();
+
                 QuotingStrategy quotes = 
adapter.getQuotingStrategy(getEntity());
                 StringBuilder sql = new StringBuilder("ALTER TABLE ");
                 quotes.appendFQN(sql, getEntity().getCatalog(), 
getEntity().getSchema(), getEntity().getName());
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 0f2e1800c..c7d2e013e 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
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.dbsync.merge.factory;
 
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
@@ -62,7 +63,9 @@ public class IngresMergerTokenFactory extends 
DefaultMergerTokenFactory {
         return new DropColumnToDb(entity, column) {
 
             @Override
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
+                DbAdapter adapter = node.getAdapter();
+
                 StringBuilder buf = new StringBuilder();
                 QuotingStrategy quotes = 
adapter.getQuotingStrategy(getEntity());
                 buf.append("ALTER TABLE ");
@@ -83,7 +86,9 @@ public class IngresMergerTokenFactory extends 
DefaultMergerTokenFactory {
     public MergerToken createAddRelationshipToDb(DbEntity entity, final 
DbRelationship rel) {
         return new AddRelationshipToDb(entity, rel) {
             @Override
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
+                DbAdapter adapter = node.getAdapter();
+
                 if (!rel.isToMany() && rel.isToPK() && !rel.isToDependentPK()) 
{
 
                     DbEntity source = (DbEntity) rel.getSourceEntity();
@@ -145,7 +150,8 @@ public class IngresMergerTokenFactory extends 
DefaultMergerTokenFactory {
         return new SetNotNullToDb(entity, column) {
 
             @Override
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
+                DbAdapter adapter = node.getAdapter();
 
                 /*
                  * TODO: we generate this query as in ingres db documentation,
@@ -184,7 +190,9 @@ public class IngresMergerTokenFactory extends 
DefaultMergerTokenFactory {
         return new SetAllowNullToDb(entity, column) {
 
             @Override
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
+                DbAdapter adapter = node.getAdapter();
+
                 StringBuilder sqlBuffer = new StringBuilder();
                 QuotingStrategy quotes = 
adapter.getQuotingStrategy(getEntity());
                 sqlBuffer.append("ALTER TABLE ");
@@ -216,7 +224,9 @@ public class IngresMergerTokenFactory extends 
DefaultMergerTokenFactory {
         return new DropRelationshipToDb(entity, rel) {
 
             @Override
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
+                DbAdapter adapter = node.getAdapter();
+
                 String fkName = getFkName();
 
                 if (fkName == null) {
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 daa6cb188..1a632a948 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
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.dbsync.merge.factory;
 
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
@@ -45,7 +46,9 @@ public class MySQLMergerTokenFactory extends 
DefaultMergerTokenFactory {
         return new SetNotNullToDb(entity, column) {
 
             @Override
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
+                DbAdapter adapter = node.getAdapter();
+
                 StringBuffer sqlBuffer = new StringBuffer();
 
                 QuotingStrategy quotes = 
adapter.getQuotingStrategy(getEntity());
@@ -72,7 +75,9 @@ public class MySQLMergerTokenFactory extends 
DefaultMergerTokenFactory {
         return new SetAllowNullToDb(entity, column) {
 
             @Override
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
+                DbAdapter adapter = node.getAdapter();
+
                 StringBuffer sqlBuffer = new StringBuffer();
 
                 QuotingStrategy quotes = 
adapter.getQuotingStrategy(getEntity());
@@ -123,7 +128,9 @@ public class MySQLMergerTokenFactory extends 
DefaultMergerTokenFactory {
         return new DropRelationshipToDb(entity, rel) {
 
             @Override
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
+                DbAdapter adapter = node.getAdapter();
+
                 String fkName = getFkName();
 
                 if (fkName == null) {
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/OracleMergerTokenFactory.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/OracleMergerTokenFactory.java
index 9ea97ceaf..ea5464ce3 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/OracleMergerTokenFactory.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/OracleMergerTokenFactory.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.dbsync.merge.factory;
 
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
@@ -77,7 +78,9 @@ public class OracleMergerTokenFactory extends 
DefaultMergerTokenFactory {
         return new SetAllowNullToDb(entity, column) {
 
             @Override
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
+                DbAdapter adapter = node.getAdapter();
+
                 StringBuffer sqlBuffer = new StringBuffer();
 
                 QuotingStrategy quotes = 
adapter.getQuotingStrategy(getEntity());
@@ -99,7 +102,9 @@ public class OracleMergerTokenFactory extends 
DefaultMergerTokenFactory {
         return new SetNotNullToDb(entity, column) {
 
             @Override
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
+                DbAdapter adapter = node.getAdapter();
+
                 StringBuffer sqlBuffer = new StringBuffer();
 
                 QuotingStrategy quotes = 
adapter.getQuotingStrategy(getEntity());
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 9b24320a4..e9edac0c9 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
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.dbsync.merge.factory;
 
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
@@ -79,7 +80,9 @@ public class SQLServerMergerTokenFactory extends 
DefaultMergerTokenFactory {
         return new SetAllowNullToDb(entity, column) {
 
             @Override
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
+                DbAdapter adapter = node.getAdapter();
+
                 StringBuffer sqlBuffer = new StringBuffer();
 
                 QuotingStrategy quotes = 
adapter.getQuotingStrategy(getEntity());
@@ -101,7 +104,9 @@ public class SQLServerMergerTokenFactory extends 
DefaultMergerTokenFactory {
         return new SetNotNullToDb(entity, column) {
 
             @Override
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
+                DbAdapter adapter = node.getAdapter();
+
                 StringBuffer sqlBuffer = new StringBuffer();
 
                 QuotingStrategy quotes = 
adapter.getQuotingStrategy(getEntity());
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/SybaseMergerTokenFactory.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/SybaseMergerTokenFactory.java
index a4941357c..1abf78048 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/SybaseMergerTokenFactory.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/SybaseMergerTokenFactory.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.dbsync.merge.factory;
 
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
@@ -45,7 +46,8 @@ public class SybaseMergerTokenFactory extends 
DefaultMergerTokenFactory {
         return new AddColumnToDb(entity, column) {
 
             @Override
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
+                DbAdapter adapter = node.getAdapter();
 
                 StringBuffer sqlBuffer = new StringBuffer();
                 QuotingStrategy quotes = 
adapter.getQuotingStrategy(getEntity());
@@ -72,7 +74,9 @@ public class SybaseMergerTokenFactory extends 
DefaultMergerTokenFactory {
         return new DropColumnToDb(entity, column) {
 
             @Override
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
+                DbAdapter adapter = node.getAdapter();
+
                 StringBuilder sqlBuffer = new StringBuilder();
                 QuotingStrategy quotes = 
adapter.getQuotingStrategy(getEntity());
                 sqlBuffer.append("ALTER TABLE ");
@@ -96,7 +100,8 @@ public class SybaseMergerTokenFactory extends 
DefaultMergerTokenFactory {
         return new SetNotNullToDb(entity, column) {
 
             @Override
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
+                DbAdapter adapter = node.getAdapter();
 
                 StringBuffer sqlBuffer = createStringQuery(
                         adapter,
@@ -117,7 +122,9 @@ public class SybaseMergerTokenFactory extends 
DefaultMergerTokenFactory {
         return new SetAllowNullToDb(entity, column) {
 
             @Override
-            public List<String> createSql(DbAdapter adapter) {
+            public List<String> createSql(DataNode node) {
+                DbAdapter adapter = node.getAdapter();
+
                 StringBuffer sqlBuffer = createStringQuery(
                         adapter,
                         getEntity(),
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AbstractToDbToken.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AbstractToDbToken.java
index 2279d0ade..5a9e87904 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AbstractToDbToken.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AbstractToDbToken.java
@@ -19,7 +19,7 @@
 
 package org.apache.cayenne.dbsync.merge.token.db;
 
-import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dbsync.merge.context.MergeDirection;
 import org.apache.cayenne.dbsync.merge.context.MergerContext;
 import org.apache.cayenne.dbsync.merge.token.AbstractMergerToken;
@@ -46,7 +46,7 @@ public abstract class AbstractToDbToken extends 
AbstractMergerToken {
 
        @Override
        public void execute(MergerContext mergerContext) {
-               for (String sql : 
createSql(mergerContext.getDataNode().getAdapter())) {
+               for (String sql : createSql(mergerContext.getDataNode())) {
                        executeSql(mergerContext, sql);
                }
        }
@@ -64,7 +64,7 @@ public abstract class AbstractToDbToken extends 
AbstractMergerToken {
                }
        }
 
-       public abstract List<String> createSql(DbAdapter adapter);
+       public abstract List<String> createSql(DataNode node);
 
        @Override
        public final MergeDirection getDirection() {
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AddColumnToDb.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AddColumnToDb.java
index 516d0f381..d487e1724 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AddColumnToDb.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AddColumnToDb.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.dbsync.merge.token.db;
 
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dba.JdbcAdapter;
@@ -51,7 +52,9 @@ public class AddColumnToDb extends 
AbstractToDbToken.EntityAndColumn {
     }
 
     @Override
-    public List<String> createSql(DbAdapter adapter) {
+    public List<String> createSql(DataNode node) {
+        DbAdapter adapter = node.getAdapter();
+
         StringBuffer sqlBuffer = new StringBuffer();
         QuotingStrategy quotes = adapter.getQuotingStrategy(getEntity());
         appendPrefix(sqlBuffer, quotes);
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AddProcedureToDb.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AddProcedureToDb.java
index 1481888e4..f84731bc1 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AddProcedureToDb.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/AddProcedureToDb.java
@@ -21,7 +21,7 @@ package org.apache.cayenne.dbsync.merge.token.db;
 
 import java.util.List;
 
-import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
 import org.apache.cayenne.map.Procedure;
@@ -39,7 +39,7 @@ public class AddProcedureToDb extends AbstractToDbToken {
     }
 
     @Override
-    public List<String> createSql(DbAdapter adapter) {
+    public List<String> createSql(DataNode node) {
         throw new UnsupportedOperationException("Can't generate SQL for 
procedure");
     }
 
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 ae49c5255..b2535a60b 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
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.dbsync.merge.token.db;
 
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.DbGenerator;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
@@ -42,7 +43,9 @@ public class AddRelationshipToDb extends 
AbstractToDbToken.Entity {
      * @see 
DbGenerator#createConstraintsQueries(org.apache.cayenne.map.DbEntity)
      */
     @Override
-    public List<String> createSql(DbAdapter adapter) {
+    public List<String> createSql(DataNode node) {
+        DbAdapter adapter = node.getAdapter();
+
         // TODO: skip FK to a different DB
         if (!this.isEmpty()) {
             String fksql = adapter.createFkConstraint(relationship);
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/CreateTableToDb.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/CreateTableToDb.java
index f399fa3cb..dc764c9ab 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/CreateTableToDb.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/CreateTableToDb.java
@@ -20,7 +20,6 @@
 package org.apache.cayenne.dbsync.merge.token.db;
 
 import org.apache.cayenne.access.DataNode;
-import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbsync.merge.context.MergerContext;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
@@ -39,13 +38,13 @@ public class CreateTableToDb extends 
AbstractToDbToken.Entity {
     }
 
     @Override
-    public List<String> createSql(DbAdapter adapter) {
+    public List<String> createSql(DataNode node) {
         List<String> sqls = new ArrayList<>();
         if(needAutoPkSupport()) {
-            sqls.addAll(adapter.getPkGenerator().createAutoPkStatements(
+            sqls.addAll(node.getPkGenerator().createAutoPkStatements(
                     Collections.singletonList(getEntity())));
         }
-        sqls.add(adapter.createTable(getEntity()));
+        sqls.add(node.getAdapter().createTable(getEntity()));
         return sqls;
     }
 
@@ -53,13 +52,12 @@ public class CreateTableToDb extends 
AbstractToDbToken.Entity {
     public void execute(MergerContext mergerContext) {
         try {
             DataNode node = mergerContext.getDataNode();
-            DbAdapter adapter = node.getAdapter();
             if(needAutoPkSupport()) {
-                adapter.getPkGenerator().createAutoPk(
+                node.getPkGenerator().createAutoPk(
                         node,
                         Collections.singletonList(getEntity()));
             }
-            executeSql(mergerContext, adapter.createTable(getEntity()));
+            executeSql(mergerContext, 
node.getAdapter().createTable(getEntity()));
         }
         catch (Exception e) {
             mergerContext.getValidationResult().addFailure(
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropColumnToDb.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropColumnToDb.java
index d10b007c1..2537e6b13 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropColumnToDb.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropColumnToDb.java
@@ -22,6 +22,7 @@ package org.apache.cayenne.dbsync.merge.token.db;
 import java.util.Collections;
 import java.util.List;
 
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
@@ -36,7 +37,9 @@ public class DropColumnToDb extends 
AbstractToDbToken.EntityAndColumn {
     }
 
     @Override
-    public List<String> createSql(DbAdapter adapter) {
+    public List<String> createSql(DataNode node) {
+        DbAdapter adapter = node.getAdapter();
+
         StringBuilder sqlBuffer = new StringBuilder();
         QuotingStrategy quotes = adapter.getQuotingStrategy(getEntity());
         sqlBuffer.append("ALTER TABLE ");
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropProcedureToDb.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropProcedureToDb.java
index 05f51630a..37b7f8804 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropProcedureToDb.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropProcedureToDb.java
@@ -21,7 +21,7 @@ package org.apache.cayenne.dbsync.merge.token.db;
 
 import java.util.List;
 
-import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
 import org.apache.cayenne.map.Procedure;
@@ -39,7 +39,7 @@ public class DropProcedureToDb extends AbstractToDbToken {
     }
 
     @Override
-    public List<String> createSql(DbAdapter adapter) {
+    public List<String> createSql(DataNode node) {
         throw new UnsupportedOperationException("Can't drop procedure to db.");
     }
 
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropRelationshipToDb.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropRelationshipToDb.java
index 2aea684ae..98755267c 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropRelationshipToDb.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropRelationshipToDb.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.dbsync.merge.token.db;
 
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
@@ -47,7 +48,9 @@ public class DropRelationshipToDb extends 
AbstractToDbToken.Entity {
     }
 
     @Override
-    public List<String> createSql(DbAdapter adapter) {
+    public List<String> createSql(DataNode node) {
+        DbAdapter adapter = node.getAdapter();
+
         if (isEmpty()) {
             return Collections.emptyList();
         }
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropTableToDb.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropTableToDb.java
index fe5da7011..263bb268f 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropTableToDb.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/DropTableToDb.java
@@ -19,7 +19,7 @@
 
 package org.apache.cayenne.dbsync.merge.token.db;
 
-import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
 import org.apache.cayenne.map.DbEntity;
@@ -34,14 +34,14 @@ public class DropTableToDb extends AbstractToDbToken.Entity 
{
     }
 
     @Override
-    public List<String> createSql(DbAdapter adapter) {
+    public List<String> createSql(DataNode node) {
         List<String> sqls = new ArrayList<>();
         // TODO: fix. some adapters drop the complete AUTO_PK_SUPPORT here
         /*
-        sqls.addAll(adapter.getPkGenerator().dropAutoPkStatements(
+        sqls.addAll(node.getPkGenerator().dropAutoPkStatements(
                 Collections.singletonList(entity)));
          */
-        sqls.addAll(adapter.dropTableStatements(getEntity()));
+        sqls.addAll(node.getAdapter().dropTableStatements(getEntity()));
         return sqls;
     }
 
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetAllowNullToDb.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetAllowNullToDb.java
index 04006b1b6..9a30be45f 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetAllowNullToDb.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetAllowNullToDb.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.dbsync.merge.token.db;
 
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
@@ -40,7 +41,9 @@ public class SetAllowNullToDb extends 
AbstractToDbToken.EntityAndColumn {
     }
 
     @Override
-    public List<String> createSql(DbAdapter adapter) {
+    public List<String> createSql(DataNode node) {
+        DbAdapter adapter = node.getAdapter();
+
         StringBuilder sqlBuffer = new StringBuilder();
         QuotingStrategy quotes = adapter.getQuotingStrategy(getEntity());
         sqlBuffer.append("ALTER TABLE ");
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetColumnTypeToDb.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetColumnTypeToDb.java
index 95deadc20..ab85e2a60 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetColumnTypeToDb.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetColumnTypeToDb.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.dbsync.merge.token.db;
 
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dba.JdbcAdapter;
@@ -60,7 +61,9 @@ public class SetColumnTypeToDb extends 
AbstractToDbToken.Entity {
     }
 
     @Override
-    public List<String> createSql(DbAdapter adapter) {
+    public List<String> createSql(DataNode node) {
+        DbAdapter adapter = node.getAdapter();
+
         StringBuffer sqlBuffer = new StringBuffer();
         QuotingStrategy quotes = adapter.getQuotingStrategy(getEntity());
         appendPrefix(sqlBuffer, quotes);
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
index 66d289e43..415108674 100644
--- 
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
@@ -22,6 +22,7 @@ package org.apache.cayenne.dbsync.merge.token.db;
 import java.util.Collections;
 import java.util.List;
 
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
@@ -75,7 +76,9 @@ public class SetGeneratedFlagToDb extends 
AbstractToDbToken.EntityAndColumn {
 
     @SuppressWarnings("unchecked")
     @Override
-    public List<String> createSql(DbAdapter adapter) {
+    public List<String> createSql(DataNode node) {
+        DbAdapter adapter = node.getAdapter();
+
         if(!adapter.supportsGeneratedKeys()) {
             return (List<String>)Collections.EMPTY_LIST;
         }
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetNotNullToDb.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetNotNullToDb.java
index 78afa5fb3..4507cacba 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetNotNullToDb.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetNotNullToDb.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.dbsync.merge.token.db;
 
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
@@ -39,7 +40,9 @@ public class SetNotNullToDb extends 
AbstractToDbToken.EntityAndColumn {
     }
 
     @Override
-    public List<String> createSql(DbAdapter adapter) {
+    public List<String> createSql(DataNode node) {
+        DbAdapter adapter = node.getAdapter();
+
         QuotingStrategy quotes = adapter.getQuotingStrategy(getEntity());
         StringBuilder sql = new StringBuilder("ALTER TABLE ");
         quotes.appendFQN(sql, getEntity().getCatalog(), 
getEntity().getSchema(), getEntity().getName());
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetPrimaryKeyToDb.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetPrimaryKeyToDb.java
index b4dbab3ad..441dcb335 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetPrimaryKeyToDb.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetPrimaryKeyToDb.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.dbsync.merge.token.db;
 
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
@@ -47,7 +48,9 @@ public class SetPrimaryKeyToDb extends 
AbstractToDbToken.Entity {
     }
 
     @Override
-    public List<String> createSql(DbAdapter adapter) {
+    public List<String> createSql(DataNode node) {
+        DbAdapter adapter = node.getAdapter();
+
         List<String> sqls = new ArrayList<>();
         if (!primaryKeyOriginal.isEmpty()) {
             appendDropOriginalPrimaryKeySQL(adapter, sqls);
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetValueForNullToDb.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetValueForNullToDb.java
index 915f460a5..42bea35b8 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetValueForNullToDb.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetValueForNullToDb.java
@@ -19,7 +19,7 @@
 
 package org.apache.cayenne.dbsync.merge.token.db;
 
-import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
 import org.apache.cayenne.dbsync.merge.token.DummyReverseToken;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
@@ -40,7 +40,7 @@ public class SetValueForNullToDb extends 
AbstractToDbToken.EntityAndColumn {
     }
     
     @Override
-    public List<String> createSql(DbAdapter adapter) {
+    public List<String> createSql(DataNode node) {
         return valueForNullProvider.createSql(getEntity(), getColumn());
     }
 
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/ToolsModule.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/ToolsModule.java
index d7a36044e..e59e07b3a 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/ToolsModule.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/ToolsModule.java
@@ -39,47 +39,25 @@ import org.apache.cayenne.configuration.RuntimeProperties;
 import org.apache.cayenne.configuration.runtime.DataSourceFactory;
 import org.apache.cayenne.configuration.runtime.DbAdapterFactory;
 import org.apache.cayenne.configuration.runtime.DefaultDbAdapterFactory;
-import org.apache.cayenne.configuration.runtime.PkGeneratorFactoryProvider;
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.configuration.xml.DefaultDataChannelMetaData;
 import org.apache.cayenne.configuration.xml.HandlerFactory;
 import org.apache.cayenne.configuration.xml.XMLDataChannelDescriptorLoader;
 import org.apache.cayenne.configuration.xml.XMLDataMapLoader;
 import org.apache.cayenne.configuration.xml.XMLReaderProvider;
-import org.apache.cayenne.dba.JdbcPkGenerator;
-import org.apache.cayenne.dba.PkGenerator;
-import org.apache.cayenne.dba.db2.DB2Adapter;
-import org.apache.cayenne.dba.db2.DB2PkGenerator;
 import org.apache.cayenne.dba.db2.DB2Sniffer;
-import org.apache.cayenne.dba.derby.DerbyAdapter;
-import org.apache.cayenne.dba.derby.DerbyPkGenerator;
 import org.apache.cayenne.dba.derby.DerbySniffer;
 import org.apache.cayenne.dba.firebird.FirebirdSniffer;
-import org.apache.cayenne.dba.frontbase.FrontBaseAdapter;
-import org.apache.cayenne.dba.frontbase.FrontBasePkGenerator;
 import org.apache.cayenne.dba.frontbase.FrontBaseSniffer;
-import org.apache.cayenne.dba.h2.H2Adapter;
-import org.apache.cayenne.dba.h2.H2PkGenerator;
 import org.apache.cayenne.dba.h2.H2Sniffer;
 import org.apache.cayenne.dba.hsqldb.HSQLDBSniffer;
-import org.apache.cayenne.dba.ingres.IngresAdapter;
-import org.apache.cayenne.dba.ingres.IngresPkGenerator;
 import org.apache.cayenne.dba.ingres.IngresSniffer;
 import org.apache.cayenne.dba.mariadb.MariaDBSniffer;
-import org.apache.cayenne.dba.mysql.MySQLAdapter;
-import org.apache.cayenne.dba.mysql.MySQLPkGenerator;
 import org.apache.cayenne.dba.mysql.MySQLSniffer;
-import org.apache.cayenne.dba.oracle.OracleAdapter;
-import org.apache.cayenne.dba.oracle.OraclePkGenerator;
 import org.apache.cayenne.dba.oracle.OracleSniffer;
-import org.apache.cayenne.dba.postgres.PostgresAdapter;
-import org.apache.cayenne.dba.postgres.PostgresPkGenerator;
 import org.apache.cayenne.dba.postgres.PostgresSniffer;
 import org.apache.cayenne.dba.sqlite.SQLiteSniffer;
-import org.apache.cayenne.dba.sqlserver.SQLServerAdapter;
 import org.apache.cayenne.dba.sqlserver.SQLServerSniffer;
-import org.apache.cayenne.dba.sybase.SybaseAdapter;
-import org.apache.cayenne.dba.sybase.SybasePkGenerator;
 import org.apache.cayenne.dba.sybase.SybaseSniffer;
 import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.di.Binder;
@@ -133,18 +111,7 @@ public class ToolsModule implements Module {
                 .addAdapterDetector(OracleSniffer.class)
                 .addAdapterDetector(PostgresSniffer.class)
                 .addAdapterDetector(MySQLSniffer.class)
-                .addAdapterDetector(MariaDBSniffer.class)
-
-                .addPkGenerator(DB2Adapter.class, DB2PkGenerator.class)
-                .addPkGenerator(DerbyAdapter.class, DerbyPkGenerator.class)
-                .addPkGenerator(FrontBaseAdapter.class, 
FrontBasePkGenerator.class)
-                .addPkGenerator(H2Adapter.class, H2PkGenerator.class)
-                .addPkGenerator(IngresAdapter.class, IngresPkGenerator.class)
-                .addPkGenerator(MySQLAdapter.class, MySQLPkGenerator.class)
-                .addPkGenerator(OracleAdapter.class, OraclePkGenerator.class)
-                .addPkGenerator(PostgresAdapter.class, 
PostgresPkGenerator.class)
-                .addPkGenerator(SQLServerAdapter.class, 
SybasePkGenerator.class)
-                .addPkGenerator(SybaseAdapter.class, SybasePkGenerator.class);
+                .addAdapterDetector(MariaDBSniffer.class);
 
         binder.bind(Logger.class).toInstance(logger);
 
@@ -161,8 +128,6 @@ public class ToolsModule implements Module {
         binder.bind(Key.get(BatchTranslator.class, 
BatchTranslator.UPDATE)).to(UpdateBatchTranslator.class);
         binder.bind(Key.get(BatchTranslator.class, 
BatchTranslator.DELETE)).to(DeleteBatchTranslator.class);
         binder.bind(SQLLogger.class).to(Slf4jSQLLogger.class);
-        
binder.bind(PkGeneratorFactoryProvider.class).to(PkGeneratorFactoryProvider.class);
-        binder.bind(PkGenerator.class).to(JdbcPkGenerator.class);
 
         binder.bind(DbAdapterFactory.class).to(DefaultDbAdapterFactory.class);
         binder.bind(DataSourceFactory.class).to(DriverDataSourceFactory.class);
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java
index a1444c95d..cec9b17d1 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java
@@ -151,7 +151,7 @@ public class DefaultDbImportAction implements 
DbImportAction {
         // Warm up the AutoAdapter by calling any method. This to avoid 
AutoAdapter opening a connection later in
         // the middle of import to detect the DB type. Opening two connections 
in the same thread causes issues with
         // some DBs (namely com.sap.cloud.db.jdbc:ngdbc:2.4.56)
-        adapter.getPkGenerator();
+        adapter.unwrap();
 
         return adapter;
     }
diff --git 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
index cc06fa25b..030565c84 100644
--- 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
+++ 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
@@ -270,7 +270,7 @@ public abstract class MergeCase {
 
         AbstractToDbToken t = (AbstractToDbToken) 
mergerFactory().createDropTableToDb(entity);
 
-        for (String sql : t.createSql(node.getAdapter())) {
+        for (String sql : t.createSql(node)) {
 
             try {
                 executeSql(sql);
diff --git 
a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/DbGenerateTask.java
 
b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/DbGenerateTask.java
index 8100fff88..9a0e70d3b 100644
--- 
a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/DbGenerateTask.java
+++ 
b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/DbGenerateTask.java
@@ -23,16 +23,12 @@ import groovy.lang.Closure;
 import org.apache.cayenne.access.DbGenerator;
 import org.apache.cayenne.configuration.DataMapLoader;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
-import org.apache.cayenne.configuration.runtime.DataSourceFactory;
 import org.apache.cayenne.configuration.runtime.DbAdapterFactory;
-import org.apache.cayenne.configuration.runtime.PkGeneratorFactoryProvider;
 import org.apache.cayenne.datasource.CayenneDataSource;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.JdbcAdapter;
-import org.apache.cayenne.dba.PkGenerator;
 import org.apache.cayenne.dbsync.DbSyncModule;
 import org.apache.cayenne.dbsync.reverse.configuration.ToolsModule;
-import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.log.NoopSQLLogger;
diff --git a/cayenne/src/main/java/org/apache/cayenne/access/DataNode.java 
b/cayenne/src/main/java/org/apache/cayenne/access/DataNode.java
index 4072ecd5d..b9e85d777 100644
--- a/cayenne/src/main/java/org/apache/cayenne/access/DataNode.java
+++ b/cayenne/src/main/java/org/apache/cayenne/access/DataNode.java
@@ -28,6 +28,7 @@ import 
org.apache.cayenne.access.translator.ProcedureTranslator;
 import org.apache.cayenne.access.translator.SQLTemplateTranslator;
 import org.apache.cayenne.access.translator.SelectTranslator;
 import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dba.PkGenerator;
 import org.apache.cayenne.log.NoopSQLLogger;
 import org.apache.cayenne.log.SQLLogger;
 import org.apache.cayenne.map.DataMap;
@@ -66,6 +67,11 @@ public class DataNode {
     protected SchemaUpdateStrategy schemaUpdateStrategy;
     protected Map<String, DataMap> dataMaps;
 
+    private PkGenerator pkGenerator;
+
+    // tells whether "pkGenerator" was installed by the user, and hence must 
not be replaced when the adapter changes
+    private boolean customPkGenerator;
+
     private DataSource dataSource;
     private SQLLogger sqlLogger;
     private RowReaderFactory rowReaderFactory;
@@ -204,6 +210,38 @@ public class DataNode {
 
     public void setAdapter(DbAdapter adapter) {
         this.adapter = adapter;
+
+        // a generator built for the old adapter is meaningless for the new 
one. A generator explicitly installed
+        // by the user is left alone.
+        if (!customPkGenerator) {
+            this.pkGenerator = adapter != null ? adapter.createPkGenerator() : 
null;
+        }
+    }
+
+    /**
+     * Returns the PkGenerator used by this node to generate primary keys. 
Unless an explicit generator was installed
+     * with {@link #setPkGenerator(PkGenerator)}, this is the default 
generator of the node's {@link DbAdapter}.
+     *
+     * @since 5.0
+     */
+    public PkGenerator getPkGenerator() {
+        return pkGenerator;
+    }
+
+    /**
+     * Installs a custom PkGenerator, overriding the default generator of the 
node's {@link DbAdapter}. A custom
+     * generator is retained across {@link #setAdapter(DbAdapter)} calls. 
Passing null restores the adapter default.
+     *
+     * @since 5.0
+     */
+    public void setPkGenerator(PkGenerator pkGenerator) {
+        if (pkGenerator != null) {
+            this.pkGenerator = pkGenerator;
+            this.customPkGenerator = true;
+        } else {
+            this.customPkGenerator = false;
+            this.pkGenerator = adapter != null ? adapter.createPkGenerator() : 
null;
+        }
     }
 
     /**
diff --git a/cayenne/src/main/java/org/apache/cayenne/access/DbGenerator.java 
b/cayenne/src/main/java/org/apache/cayenne/access/DbGenerator.java
index 631bb2e47..90080cf44 100644
--- a/cayenne/src/main/java/org/apache/cayenne/access/DbGenerator.java
+++ b/cayenne/src/main/java/org/apache/cayenne/access/DbGenerator.java
@@ -156,7 +156,7 @@ public class DbGenerator {
                createConstraints = new HashMap<>();
 
                DbAdapter adapter = getAdapter();
-               for (final DbEntity dbe : this.dbEntitiesInInsertOrder) {
+               for (DbEntity dbe : this.dbEntitiesInInsertOrder) {
 
                        String name = dbe.getName();
 
@@ -170,7 +170,7 @@ public class DbGenerator {
                        createConstraints.put(name, 
createConstraintsQueries(dbe));
                }
 
-               PkGenerator pkGenerator = adapter.getPkGenerator();
+               PkGenerator pkGenerator = adapter.createPkGenerator();
                dropPK = 
pkGenerator.dropAutoPkStatements(dbEntitiesRequiringAutoPK);
                createPK = 
pkGenerator.createAutoPkStatements(dbEntitiesRequiringAutoPK);
        }
@@ -214,13 +214,13 @@ public class DbGenerator {
                }
 
                if (shouldCreateTables) {
-                       for (final DbEntity ent : dbEntitiesInInsertOrder) {
+                       for (DbEntity ent : dbEntitiesInInsertOrder) {
                                list.add(createTables.get(ent.getName()));
                        }
                }
 
                if (shouldCreateFKConstraints) {
-                       for (final DbEntity ent : dbEntitiesInInsertOrder) {
+                       for (DbEntity ent : dbEntitiesInInsertOrder) {
                                List<String> fks = 
createConstraints.get(ent.getName());
                                list.addAll(fks);
                        }
@@ -264,7 +264,7 @@ public class DbGenerator {
                                // create tables
                                List<String> createdTables = new ArrayList<>();
                                if (shouldCreateTables) {
-                                       for (final DbEntity ent : 
dbEntitiesInInsertOrder) {
+                                       for (DbEntity ent : 
dbEntitiesInInsertOrder) {
 
                                                // only create missing tables
 
@@ -288,18 +288,14 @@ public class DbGenerator {
 
                                // drop PK
                                if (shouldDropPKSupport) {
-                                       List<String> dropAutoPKSQL = 
getAdapter().getPkGenerator().dropAutoPkStatements(
-                                                       
dbEntitiesRequiringAutoPK);
-                                       for (final String sql : dropAutoPKSQL) {
+                                       for (String sql : dropPK) {
                                                safeExecute(connection, sql);
                                        }
                                }
 
                                // create pk
                                if (shouldCreatePKSupport) {
-                                       List<String> createAutoPKSQL = 
getAdapter().getPkGenerator().createAutoPkStatements(
-                                                       
dbEntitiesRequiringAutoPK);
-                                       for (final String sql : 
createAutoPKSQL) {
+                                       for (String sql : createPK) {
                                                safeExecute(connection, sql);
                                        }
                                }
@@ -342,7 +338,7 @@ public class DbGenerator {
         */
        public List<String> createConstraintsQueries(DbEntity table) {
                List<String> list = new ArrayList<>();
-               for (final DbRelationship rel : table.getRelationships()) {
+               for (DbRelationship rel : table.getRelationships()) {
 
                        if (rel.isToMany()) {
                                continue;
@@ -489,7 +485,7 @@ public class DbGenerator {
 
                        // tables with invalid DbAttributes are not included
                        boolean invalidAttributes = false;
-                       for (final DbAttribute attr : 
nextEntity.getAttributes()) {
+                       for (DbAttribute attr : nextEntity.getAttributes()) {
                                if (attr.getType() == TypesMapping.NOT_DEFINED) 
{
                                        LOGGER.info("Skipping entity, attribute 
type is undefined: {}.{}", nextEntity.getName(),
                                                        attr.getName());
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/flush/PermanentObjectIdVisitor.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/flush/PermanentObjectIdVisitor.java
index a412db1c2..d4d1598f5 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/flush/PermanentObjectIdVisitor.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/flush/PermanentObjectIdVisitor.java
@@ -96,7 +96,7 @@ class PermanentObjectIdVisitor implements 
DbRowOpVisitor<Void> {
     private void createPermanentId(InsertDbRowOp dbRow) {
         ObjectId id = dbRow.getChangeId();
         boolean supportsGeneratedKeys = 
lastNode.getAdapter().supportsGeneratedKeys();
-        PkGenerator pkGenerator = lastNode.getAdapter().getPkGenerator();
+        PkGenerator pkGenerator = lastNode.getPkGenerator();
 
         // modify replacement id directly...
         Map<String, Object> idMap = id.getReplacementIdMap();
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/CoreModule.java
 
b/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/CoreModule.java
index 185348de9..d92aa9f9c 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/CoreModule.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/CoreModule.java
@@ -75,41 +75,19 @@ import 
org.apache.cayenne.configuration.xml.NoopDataChannelMetaData;
 import org.apache.cayenne.configuration.xml.XMLDataChannelDescriptorLoader;
 import org.apache.cayenne.configuration.xml.XMLDataMapLoader;
 import org.apache.cayenne.configuration.xml.XMLReaderProvider;
-import org.apache.cayenne.dba.JdbcPkGenerator;
-import org.apache.cayenne.dba.PkGenerator;
-import org.apache.cayenne.dba.db2.DB2Adapter;
-import org.apache.cayenne.dba.db2.DB2PkGenerator;
 import org.apache.cayenne.dba.db2.DB2Sniffer;
-import org.apache.cayenne.dba.derby.DerbyAdapter;
-import org.apache.cayenne.dba.derby.DerbyPkGenerator;
 import org.apache.cayenne.dba.derby.DerbySniffer;
 import org.apache.cayenne.dba.firebird.FirebirdSniffer;
-import org.apache.cayenne.dba.frontbase.FrontBaseAdapter;
-import org.apache.cayenne.dba.frontbase.FrontBasePkGenerator;
 import org.apache.cayenne.dba.frontbase.FrontBaseSniffer;
-import org.apache.cayenne.dba.h2.H2Adapter;
-import org.apache.cayenne.dba.h2.H2PkGenerator;
 import org.apache.cayenne.dba.h2.H2Sniffer;
 import org.apache.cayenne.dba.hsqldb.HSQLDBSniffer;
-import org.apache.cayenne.dba.ingres.IngresAdapter;
-import org.apache.cayenne.dba.ingres.IngresPkGenerator;
 import org.apache.cayenne.dba.ingres.IngresSniffer;
 import org.apache.cayenne.dba.mariadb.MariaDBSniffer;
-import org.apache.cayenne.dba.mysql.MySQLAdapter;
-import org.apache.cayenne.dba.mysql.MySQLPkGenerator;
 import org.apache.cayenne.dba.mysql.MySQLSniffer;
-import org.apache.cayenne.dba.oracle.OracleAdapter;
-import org.apache.cayenne.dba.oracle.OraclePkGenerator;
 import org.apache.cayenne.dba.oracle.OracleSniffer;
-import org.apache.cayenne.dba.postgres.PostgresAdapter;
-import org.apache.cayenne.dba.postgres.PostgresPkGenerator;
 import org.apache.cayenne.dba.postgres.PostgresSniffer;
 import org.apache.cayenne.dba.sqlite.SQLiteSniffer;
-import org.apache.cayenne.dba.sqlserver.SQLServerAdapter;
-import org.apache.cayenne.dba.sqlserver.SQLServerPkGenerator;
 import org.apache.cayenne.dba.sqlserver.SQLServerSniffer;
-import org.apache.cayenne.dba.sybase.SybaseAdapter;
-import org.apache.cayenne.dba.sybase.SybasePkGenerator;
 import org.apache.cayenne.dba.sybase.SybaseSniffer;
 import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.di.Binder;
@@ -254,20 +232,6 @@ public class CoreModule implements Module {
         return binder.bindList(DbAdapterDetector.class, 
Constants.ADAPTER_DETECTORS_LIST);
     }
 
-    /**
-     * Provides access to a DI map builder for {@link PkGenerator}'s that 
allows downstream modules to
-     * "contribute" their own pk generators.
-     *
-     * @param binder DI binder passed to the module during injector startup.
-     * @return MapBuilder for properties.
-     * @since 4.1
-     * @deprecated in favor of {@link #extend(Binder)} API
-     */
-    @Deprecated(since = "5.0", forRemoval = true)
-    public static MapBuilder<PkGenerator> contributePkGenerators(Binder 
binder) {
-        return binder.bindMap(PkGenerator.class);
-    }
-
     /**
      * Provides access to a DI map builder for runtime properties that allows 
downstream modules to
      * "contribute" their own properties.
@@ -369,18 +333,6 @@ public class CoreModule implements Module {
                 .addAdapterDetector(MySQLSniffer.class)
                 .addAdapterDetector(MariaDBSniffer.class)
 
-                //  PkGenerators for the known DbAdapters
-                .addPkGenerator(DB2Adapter.class, DB2PkGenerator.class)
-                .addPkGenerator(DerbyAdapter.class, DerbyPkGenerator.class)
-                .addPkGenerator(FrontBaseAdapter.class, 
FrontBasePkGenerator.class)
-                .addPkGenerator(H2Adapter.class, H2PkGenerator.class)
-                .addPkGenerator(IngresAdapter.class, IngresPkGenerator.class)
-                .addPkGenerator(MySQLAdapter.class, MySQLPkGenerator.class)
-                .addPkGenerator(OracleAdapter.class, OraclePkGenerator.class)
-                .addPkGenerator(PostgresAdapter.class, 
PostgresPkGenerator.class)
-                .addPkGenerator(SQLServerAdapter.class, 
SQLServerPkGenerator.class)
-                .addPkGenerator(SybaseAdapter.class, SybasePkGenerator.class)
-
                 .addSyncFilter(TransactionFilter.class)
 
                 // ExtendedTypes
@@ -424,8 +376,6 @@ public class CoreModule implements Module {
         binder.bind(SQLLogger.class).to(Slf4jSQLLogger.class);
         
binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
         
binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
-        
binder.bind(PkGeneratorFactoryProvider.class).to(PkGeneratorFactoryProvider.class);
-        binder.bind(PkGenerator.class).to(JdbcPkGenerator.class);
         
binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class);
         binder.bind(EventManager.class).toProvider(EventManagerProvider.class);
         binder.bind(QueryCache.class).toProvider(MapQueryCacheProvider.class);
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/CoreModuleExtender.java
 
b/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/CoreModuleExtender.java
index 20d9bc9ef..605891741 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/CoreModuleExtender.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/CoreModuleExtender.java
@@ -31,8 +31,6 @@ import org.apache.cayenne.commitlog.CommitLogListener;
 import org.apache.cayenne.commitlog.meta.AnnotationCommitLogEntityFactory;
 import org.apache.cayenne.commitlog.meta.CommitLogEntityFactory;
 import org.apache.cayenne.configuration.Constants;
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dba.PkGenerator;
 import org.apache.cayenne.di.Binder;
 import org.apache.cayenne.di.ListBuilder;
 import org.apache.cayenne.di.MapBuilder;
@@ -52,7 +50,6 @@ public class CoreModuleExtender {
     private MapBuilder<String> properties;
     private ListBuilder<String> projectLocations;
     private ListBuilder<DbAdapterDetector> adapterDetectors;
-    private MapBuilder<PkGenerator> pkGenerators;
     private ListBuilder<DataChannelQueryFilter> queryFilters;
     private ListBuilder<DataChannelSyncFilter> syncFilters;
     private ListBuilder<Object> listeners;
@@ -71,7 +68,6 @@ public class CoreModuleExtender {
         contributeProperties();
         contributeProjectLocations();
         contributeAdapterDetectors();
-        contributePkGenerators();
         contributeQueryFilters();
         contributeSyncFilters();
         contributeListeners();
@@ -155,22 +151,6 @@ public class CoreModuleExtender {
         return this;
     }
 
-    /**
-     * Adds a custom PK generator per DbAdapter
-     */
-    public CoreModuleExtender addPkGenerator(Class<? extends DbAdapter> 
adapter, PkGenerator pkGenerator) {
-        contributePkGenerators().put(adapter.getName(), pkGenerator);
-        return this;
-    }
-
-    /**
-     * Adds a custom PK generator per DbAdapter
-     */
-    public CoreModuleExtender addPkGenerator(Class<? extends DbAdapter> 
adapter, Class<? extends PkGenerator> pkGeneratorType) {
-        contributePkGenerators().put(adapter.getName(), pkGeneratorType);
-        return this;
-    }
-
     /**
      * Adds a custom query filter to the end of the existing filter list
      */
@@ -483,11 +463,4 @@ public class CoreModuleExtender {
         }
         return valueObjectTypes;
     }
-
-    private MapBuilder<PkGenerator> contributePkGenerators() {
-        if (pkGenerators == null) {
-            pkGenerators = binder.bindMap(PkGenerator.class);
-        }
-        return pkGenerators;
-    }
 }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/DefaultDbAdapterFactory.java
 
b/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/DefaultDbAdapterFactory.java
index b8099ff5f..0ed4dec2a 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/DefaultDbAdapterFactory.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/DefaultDbAdapterFactory.java
@@ -24,7 +24,6 @@ import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.dba.AutoAdapter;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.JdbcAdapter;
-import org.apache.cayenne.dba.PkGenerator;
 import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.di.Injector;
@@ -36,7 +35,6 @@ import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.SQLException;
 import java.util.List;
-import java.util.Objects;
 
 /**
  * A factory of DbAdapters that either loads user-provided adapter or guesses
@@ -54,9 +52,6 @@ public class DefaultDbAdapterFactory implements 
DbAdapterFactory {
     @Inject
     protected AdhocObjectFactory objectFactory;
 
-    @Inject
-    protected PkGeneratorFactoryProvider pkGeneratorProvider;
-
     protected List<DbAdapterDetector> detectors;
 
     public DefaultDbAdapterFactory(@Inject(Constants.ADAPTER_DETECTORS_LIST) 
List<DbAdapterDetector> detectors) {
@@ -83,8 +78,7 @@ public class DefaultDbAdapterFactory implements 
DbAdapterFactory {
         }
 
         if (adapterType != null) {
-            DbAdapter dbAdapter = objectFactory.newInstance(DbAdapter.class, 
adapterType);
-            return setupPkGenerator(dbAdapter);
+            return objectFactory.newInstance(DbAdapter.class, adapterType);
         } else {
             return new AutoAdapter(() -> detectAdapter(dataSource));
         }
@@ -117,7 +111,7 @@ public class DefaultDbAdapterFactory implements 
DbAdapterFactory {
                 // TODO: should detector do this??
                 injector.injectMembers(adapter);
 
-                return setupPkGenerator(adapter);
+                return adapter;
             }
         }
 
@@ -128,13 +122,4 @@ public class DefaultDbAdapterFactory implements 
DbAdapterFactory {
         LOGGER.warn("Failed to detect database type, using generic adapter");
         return objectFactory.newInstance(DbAdapter.class, 
JdbcAdapter.class.getName());
     }
-
-    protected DbAdapter setupPkGenerator(DbAdapter dbAdapter) {
-        PkGenerator pkGenerator = 
pkGeneratorProvider.get(Objects.requireNonNull(dbAdapter));
-        if (pkGenerator != null) {
-            pkGenerator.setAdapter(dbAdapter);
-            dbAdapter.setPkGenerator(pkGenerator);
-        }
-        return dbAdapter;
-    }
 }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/PkGeneratorFactoryProvider.java
 
b/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/PkGeneratorFactoryProvider.java
deleted file mode 100644
index 9c3682e57..000000000
--- 
a/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/PkGeneratorFactoryProvider.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*****************************************************************
- *   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
- *
- *    https://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.configuration.runtime;
-
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dba.PkGenerator;
-import org.apache.cayenne.di.DIRuntimeException;
-import org.apache.cayenne.di.Inject;
-
-import java.util.Map;
-import java.util.Objects;
-
-/**
- * Per-adapter provider of PkGenerators
- *
- * @since 4.1
- */
-public class PkGeneratorFactoryProvider {
-
-    private final Map<String, PkGenerator> perAdapterValues;
-    private final PkGenerator defaultValue;
-
-    public PkGeneratorFactoryProvider(
-            @Inject Map<String, PkGenerator> perAdapterValues,
-            @Inject PkGenerator defaultValue) {
-        this.perAdapterValues = Objects.requireNonNull(perAdapterValues);
-        this.defaultValue = Objects.requireNonNull(defaultValue);
-    }
-
-    public PkGenerator get(DbAdapter adapter) throws DIRuntimeException {
-        return 
perAdapterValues.getOrDefault(adapter.unwrap().getClass().getName(), 
defaultValue);
-    }
-}
diff --git a/cayenne/src/main/java/org/apache/cayenne/dba/AutoAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/AutoAdapter.java
index 8f3680578..87aafc70b 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/AutoAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/AutoAdapter.java
@@ -53,7 +53,6 @@ import java.util.List;
 public class AutoAdapter implements DbAdapter {
 
        protected Provider<DbAdapter> adapterProvider;
-       protected PkGenerator pkGenerator;
 
        /**
         * The actual adapter that is delegated methods execution.
@@ -215,19 +214,11 @@ public class AutoAdapter implements DbAdapter {
        }
 
        /**
-        * Returns a primary key generator.
+        * Returns the default primary key generator of the wrapped adapter.
         */
        @Override
-       public PkGenerator getPkGenerator() {
-               return (pkGenerator != null) ? pkGenerator : 
getAdapter().getPkGenerator();
-       }
-
-       /**
-        * Sets a PK generator override. If set to non-null value, such PK 
generator
-        * will be used instead of the one provided by wrapped adapter.
-        */
-       public void setPkGenerator(PkGenerator pkGenerator) {
-               this.pkGenerator = pkGenerator;
+       public PkGenerator createPkGenerator() {
+               return getAdapter().createPkGenerator();
        }
 
        @Override
diff --git a/cayenne/src/main/java/org/apache/cayenne/dba/DbAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/DbAdapter.java
index fbf139d93..6999c9a1a 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/DbAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/DbAdapter.java
@@ -221,21 +221,16 @@ public interface DbAdapter {
     ExtendedTypeMap getExtendedTypes();
 
     /**
-     * Returns primary key generator associated with this DbAdapter.
-     */
-    PkGenerator getPkGenerator();
-
-    /**
-     * Set custom PK generator  associated with this DbAdapter.
+     * Returns a new primary key generator of the default type associated with 
this adapter. DataNode would use this
+     * generator, unless explicitly overridden. DbAdapter does not cache the 
generator as it is often stateful.
      *
-     * @param pkGenerator to set
-     * @since 4.1
+     * @since 5.0
      */
-    void setPkGenerator(PkGenerator pkGenerator);
+    PkGenerator createPkGenerator();
 
     /**
      * Creates and returns a DbAttribute based on supplied parameters (usually
-     * obtained from database meta data).
+     * obtained from database metadata).
      *
      * @param name       database column name
      * @param typeName   database specific type name, may be used as a hint to
diff --git a/cayenne/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
index d410524e3..ce5f1b58e 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
@@ -68,7 +68,6 @@ import java.util.Map;
  */
 public class JdbcAdapter implements DbAdapter {
 
-    private PkGenerator pkGenerator;
     protected QuotingStrategy quotingStrategy;
 
     protected int defaultCharColumnLength;
@@ -229,21 +228,11 @@ public class JdbcAdapter implements DbAdapter {
     }
 
     /**
-     * Returns primary key generator associated with this DbAdapter.
+     * Returns a generic PK generator based on the "AUTO_PK_SUPPORT" lookup 
table.
      */
     @Override
-    public PkGenerator getPkGenerator() {
-        return pkGenerator;
-    }
-
-    /**
-     * Sets new primary key generator.
-     *
-     * @since 1.1
-     */
-    @Override
-    public void setPkGenerator(PkGenerator pkGenerator) {
-        this.pkGenerator = pkGenerator;
+    public PkGenerator createPkGenerator() {
+        return new JdbcPkGenerator(this);
     }
 
     /**
diff --git a/cayenne/src/main/java/org/apache/cayenne/dba/JdbcPkGenerator.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/JdbcPkGenerator.java
index e49ea2899..e295a91b3 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/JdbcPkGenerator.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/JdbcPkGenerator.java
@@ -54,17 +54,11 @@ public class JdbcPkGenerator implements PkGenerator {
     public static final int DEFAULT_PK_CACHE_SIZE = 20;
     static final long DEFAULT_PK_START_VALUE = 200;
 
-    protected JdbcAdapter adapter;
+    protected final JdbcAdapter adapter;
     protected ConcurrentMap<String, Queue<Long>> pkCache = new 
ConcurrentHashMap<>();
     protected int pkCacheSize = DEFAULT_PK_CACHE_SIZE;
     protected long pkStartValue = DEFAULT_PK_START_VALUE;
 
-    /**
-     * @since 4.1
-     */
-    public JdbcPkGenerator() {
-    }
-
     public JdbcPkGenerator(JdbcAdapter adapter) {
         this.adapter = adapter;
     }
@@ -251,11 +245,6 @@ public class JdbcPkGenerator implements PkGenerator {
         }
     }
 
-    @Override
-    public void setAdapter(DbAdapter adapter) {
-        this.adapter = (JdbcAdapter) adapter;
-    }
-
     /**
      * Performs primary key generation ignoring cache. Generates a range of
      * primary keys as specified by "pkCacheSize" bean property.
diff --git a/cayenne/src/main/java/org/apache/cayenne/dba/PkGenerator.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/PkGenerator.java
index 761435f05..31c98921e 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/PkGenerator.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/PkGenerator.java
@@ -80,13 +80,6 @@ public interface PkGenerator {
      */
     Object generatePk(DataNode dataNode, DbAttribute pk, Class<?> javaType);
 
-    /**
-     * Install the adapter associated with current PkGenerator
-     *
-     * @since 4.1
-     */
-    void setAdapter(DbAdapter q);
-
     /**
      * Get an adapter associated with current PkGenerator
      *
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/SequencePkGenerator.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/SequencePkGenerator.java
index 2b7809417..9a1fb1c51 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/SequencePkGenerator.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/SequencePkGenerator.java
@@ -46,7 +46,7 @@ import java.util.List;
  * </p>
  *
  * <pre>
- * dataNode.getAdapter().getPkGenerator().setPkCacheSize(1);
+ * dataNode.getPkGenerator().setPkCacheSize(1);
  * </pre>
  *
  * @since 5.0
@@ -55,10 +55,6 @@ public abstract class SequencePkGenerator extends 
JdbcPkGenerator {
 
     private static final String _SEQUENCE_PREFIX = "pk_";
 
-    public SequencePkGenerator() {
-        super();
-    }
-
     protected SequencePkGenerator(JdbcAdapter adapter) {
         super(adapter);
     }
diff --git a/cayenne/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java
index be43f14e0..20a5820ac 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java
@@ -36,6 +36,7 @@ import org.apache.cayenne.configuration.Constants;
 import org.apache.cayenne.configuration.RuntimeProperties;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dba.JdbcAdapter;
+import org.apache.cayenne.dba.PkGenerator;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.query.Query;
@@ -170,6 +171,14 @@ public class DB2Adapter extends JdbcAdapter {
         return type != Types.TIME && super.typeSupportsScale(type);
     }
 
+    /**
+     * Returns a {@link DB2PkGenerator}.
+     */
+    @Override
+    public PkGenerator createPkGenerator() {
+        return new DB2PkGenerator(this);
+    }
+
     /**
      * @since 4.2
      */
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/db2/DB2PkGenerator.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/db2/DB2PkGenerator.java
index d9b513d9d..7a233b484 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/db2/DB2PkGenerator.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/db2/DB2PkGenerator.java
@@ -27,20 +27,12 @@ import org.apache.cayenne.map.DbEntity;
  */
 public class DB2PkGenerator extends SequencePkGenerator {
 
-    /**
-     * Used by DI
-     * @since 4.1
-     */
-    public DB2PkGenerator() {
-        super();
-    }
+    private static final String _SEQUENCE_PREFIX = "S_";
 
-    DB2PkGenerator(JdbcAdapter adapter) {
+    public DB2PkGenerator(JdbcAdapter adapter) {
         super(adapter);
     }
 
-    private static final String _SEQUENCE_PREFIX = "S_";
-
     @Override
     protected String sequenceName(DbEntity entity) {
         return super.sequenceName(entity).toUpperCase();
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java
index 4de7657c5..531858ec5 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java
@@ -34,6 +34,7 @@ import 
org.apache.cayenne.access.types.ValueObjectTypeRegistry;
 import org.apache.cayenne.configuration.Constants;
 import org.apache.cayenne.configuration.RuntimeProperties;
 import org.apache.cayenne.dba.JdbcAdapter;
+import org.apache.cayenne.dba.PkGenerator;
 import org.apache.cayenne.dba.NativeColumnType;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.di.Inject;
@@ -194,6 +195,14 @@ public class DerbyAdapter extends JdbcAdapter {
         return type != Types.TIME && super.typeSupportsScale(type);
     }
 
+    /**
+     * Returns a {@link DerbyPkGenerator}.
+     */
+    @Override
+    public PkGenerator createPkGenerator() {
+        return new DerbyPkGenerator(this);
+    }
+
     /**
      * @since 4.2
      */
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/derby/DerbyPkGenerator.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/derby/DerbyPkGenerator.java
index 876f62cd8..c04b82553 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/derby/DerbyPkGenerator.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/derby/DerbyPkGenerator.java
@@ -30,15 +30,7 @@ import org.apache.cayenne.map.DbEntity;
  */
 public class DerbyPkGenerator extends SequencePkGenerator {
 
-    /**
-     * Used by DI
-     * @since 4.1
-     */
-    public DerbyPkGenerator() {
-        super();
-    }
-
-    DerbyPkGenerator(JdbcAdapter adapter) {
+    public DerbyPkGenerator(JdbcAdapter adapter) {
         super(adapter);
     }
 
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseAdapter.java
index 0ea493786..1f926fa25 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseAdapter.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseAdapter.java
@@ -30,6 +30,7 @@ import 
org.apache.cayenne.access.types.ValueObjectTypeRegistry;
 import org.apache.cayenne.configuration.Constants;
 import org.apache.cayenne.configuration.RuntimeProperties;
 import org.apache.cayenne.dba.JdbcAdapter;
+import org.apache.cayenne.dba.PkGenerator;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.di.Inject;
@@ -100,6 +101,14 @@ public class FrontBaseAdapter extends JdbcAdapter {
         };
     }
 
+    /**
+     * Returns a {@link FrontBasePkGenerator}.
+     */
+    @Override
+    public PkGenerator createPkGenerator() {
+        return new FrontBasePkGenerator(this);
+    }
+
     /**
      * @since 4.2
      */
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/frontbase/FrontBasePkGenerator.java
 
b/cayenne/src/main/java/org/apache/cayenne/dba/frontbase/FrontBasePkGenerator.java
index 919afa00c..2f4bcc126 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/dba/frontbase/FrontBasePkGenerator.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/dba/frontbase/FrontBasePkGenerator.java
@@ -38,14 +38,6 @@ import java.util.List;
  */
 public class FrontBasePkGenerator extends JdbcPkGenerator {
 
-    /**
-     * Used by DI
-     * @since 4.1
-     */
-    public FrontBasePkGenerator() {
-        super();
-    }
-
     public FrontBasePkGenerator(JdbcAdapter adapter) {
         super(adapter);
         pkStartValue = 1000000;
diff --git a/cayenne/src/main/java/org/apache/cayenne/dba/h2/H2Adapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/h2/H2Adapter.java
index d98e5d3de..fd4d0271a 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/h2/H2Adapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/h2/H2Adapter.java
@@ -32,6 +32,7 @@ import 
org.apache.cayenne.access.types.ValueObjectTypeRegistry;
 import org.apache.cayenne.configuration.Constants;
 import org.apache.cayenne.configuration.RuntimeProperties;
 import org.apache.cayenne.dba.JdbcAdapter;
+import org.apache.cayenne.dba.PkGenerator;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.query.Query;
@@ -103,6 +104,14 @@ public class H2Adapter extends JdbcAdapter {
         }
     }
 
+    /**
+     * Returns a {@link H2PkGenerator}.
+     */
+    @Override
+    public PkGenerator createPkGenerator() {
+        return new H2PkGenerator(this);
+    }
+
     /**
      * @since 4.2
      */
diff --git a/cayenne/src/main/java/org/apache/cayenne/dba/h2/H2PkGenerator.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/h2/H2PkGenerator.java
index ae45d710c..eb1d30ebf 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/h2/H2PkGenerator.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/h2/H2PkGenerator.java
@@ -30,15 +30,7 @@ import org.apache.cayenne.map.DbEntity;
  */
 public class H2PkGenerator extends SequencePkGenerator {
 
-    /**
-     * Used by DI
-     * @since 4.1
-     */
-    public H2PkGenerator() {
-        super();
-    }
-
-    protected H2PkGenerator(JdbcAdapter adapter) {
+    public H2PkGenerator(JdbcAdapter adapter) {
         super(adapter);
     }
 
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/ingres/IngresAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/ingres/IngresAdapter.java
index 6bf8fcd14..32526ed8d 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/ingres/IngresAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/ingres/IngresAdapter.java
@@ -30,6 +30,7 @@ import org.apache.cayenne.configuration.Constants;
 import org.apache.cayenne.configuration.RuntimeProperties;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dba.JdbcAdapter;
+import org.apache.cayenne.dba.PkGenerator;
 import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.map.DbAttribute;
@@ -92,6 +93,14 @@ public class IngresAdapter extends JdbcAdapter {
         };
     }
 
+    /**
+     * Returns a {@link IngresPkGenerator}.
+     */
+    @Override
+    public PkGenerator createPkGenerator() {
+        return new IngresPkGenerator(this);
+    }
+
     /**
      * @since 4.2
      */
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/ingres/IngresPkGenerator.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/ingres/IngresPkGenerator.java
index 9fd76cefd..3c7c6cdbe 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/ingres/IngresPkGenerator.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/ingres/IngresPkGenerator.java
@@ -29,15 +29,7 @@ import org.apache.cayenne.dba.SequencePkGenerator;
  */
 public class IngresPkGenerator extends SequencePkGenerator {
 
-    /**
-     * Used by DI
-     * @since 4.1
-     */
-    public IngresPkGenerator() {
-        super();
-    }
-
-    protected IngresPkGenerator(JdbcAdapter adapter) {
+    public IngresPkGenerator(JdbcAdapter adapter) {
         super(adapter);
     }
 
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java
index 0b602abd4..c3b928674 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java
@@ -41,6 +41,7 @@ import org.apache.cayenne.configuration.RuntimeProperties;
 import org.apache.cayenne.dba.DefaultQuotingStrategy;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dba.JdbcAdapter;
+import org.apache.cayenne.dba.PkGenerator;
 import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.map.DbAttribute;
@@ -124,6 +125,14 @@ public class MySQLAdapter extends JdbcAdapter {
         return new DefaultQuotingStrategy('`', '`');
     }
 
+    /**
+     * Returns a {@link MySQLPkGenerator}.
+     */
+    @Override
+    public PkGenerator createPkGenerator() {
+        return new MySQLPkGenerator(this);
+    }
+
     /**
      * @since 4.2
      */
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/mysql/MySQLPkGenerator.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/mysql/MySQLPkGenerator.java
index 96c0efd1b..6e321a307 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/mysql/MySQLPkGenerator.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/mysql/MySQLPkGenerator.java
@@ -39,15 +39,7 @@ public class MySQLPkGenerator extends JdbcPkGenerator {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(MySQLPkGenerator.class);
 
-    /**
-     * Used by DI
-     * @since 4.1
-     */
-    public MySQLPkGenerator() {
-        super();
-    }
-
-    MySQLPkGenerator(JdbcAdapter adapter) {
+    public MySQLPkGenerator(JdbcAdapter adapter) {
         super(adapter);
     }
 
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
index c55d39d6e..e5468cc9c 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
@@ -35,6 +35,7 @@ import org.apache.cayenne.configuration.Constants;
 import org.apache.cayenne.configuration.RuntimeProperties;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dba.JdbcAdapter;
+import org.apache.cayenne.dba.PkGenerator;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
@@ -201,6 +202,14 @@ public class OracleAdapter extends JdbcAdapter {
         };
     }
 
+    /**
+     * Returns a {@link OraclePkGenerator}.
+     */
+    @Override
+    public PkGenerator createPkGenerator() {
+        return new OraclePkGenerator(this);
+    }
+
     /**
      * @since 4.2
      */
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OraclePkGenerator.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OraclePkGenerator.java
index 2c050b1d1..08eef19f2 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OraclePkGenerator.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OraclePkGenerator.java
@@ -27,16 +27,7 @@ import org.apache.cayenne.dba.SequencePkGenerator;
  */
 public class OraclePkGenerator extends SequencePkGenerator {
 
-    /**
-     * Used by DI
-     *
-     * @since 4.1
-     */
-    public OraclePkGenerator() {
-        super();
-    }
-
-    protected OraclePkGenerator(JdbcAdapter adapter) {
+    public OraclePkGenerator(JdbcAdapter adapter) {
         super(adapter);
     }
 
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/postgres/PostgresAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/postgres/PostgresAdapter.java
index 81bc6e561..e1852390b 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/postgres/PostgresAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/postgres/PostgresAdapter.java
@@ -34,6 +34,7 @@ import org.apache.cayenne.configuration.Constants;
 import org.apache.cayenne.configuration.RuntimeProperties;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dba.JdbcAdapter;
+import org.apache.cayenne.dba.PkGenerator;
 import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.map.DbAttribute;
@@ -109,6 +110,14 @@ public class PostgresAdapter extends JdbcAdapter {
         };
     }
 
+    /**
+     * Returns a {@link PostgresPkGenerator}.
+     */
+    @Override
+    public PkGenerator createPkGenerator() {
+        return new PostgresPkGenerator(this);
+    }
+
     /**
      * @since 4.2
      */
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/postgres/PostgresPkGenerator.java
 
b/cayenne/src/main/java/org/apache/cayenne/dba/postgres/PostgresPkGenerator.java
index 1a863b473..0aa163d1f 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/dba/postgres/PostgresPkGenerator.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/dba/postgres/PostgresPkGenerator.java
@@ -28,15 +28,7 @@ import org.apache.cayenne.map.DbEntity;
  */
 public class PostgresPkGenerator extends SequencePkGenerator {
 
-    /**
-     * Used by DI
-     * @since 4.1
-     */
-    public PostgresPkGenerator() {
-        super();
-    }
-
-    protected PostgresPkGenerator(JdbcAdapter adapter) {
+    public PostgresPkGenerator(JdbcAdapter adapter) {
         super(adapter);
     }
 
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java
index 26541db6f..4d12eb681 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java
@@ -38,6 +38,7 @@ import org.apache.cayenne.configuration.RuntimeProperties;
 import org.apache.cayenne.dba.DefaultQuotingStrategy;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dba.JdbcAdapter;
+import org.apache.cayenne.dba.PkGenerator;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
@@ -176,6 +177,14 @@ public class SQLServerAdapter extends JdbcAdapter {
         return false;
     }
 
+    /**
+     * Returns a {@link SQLServerPkGenerator}.
+     */
+    @Override
+    public PkGenerator createPkGenerator() {
+        return new SQLServerPkGenerator(this);
+    }
+
     /**
      * @since 4.2
      */
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerPkGenerator.java
 
b/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerPkGenerator.java
index 78ff55111..02c115c71 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerPkGenerator.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerPkGenerator.java
@@ -42,15 +42,7 @@ import java.util.List;
  */
 public class SQLServerPkGenerator extends JdbcPkGenerator {
 
-       /**
-        * Used by DI
-        * @since 4.1
-        */
-       public SQLServerPkGenerator(){
-               super();
-       }
-
-       protected SQLServerPkGenerator(JdbcAdapter adapter) {
+       public SQLServerPkGenerator(JdbcAdapter adapter) {
                super(adapter);
        }
 
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/sybase/SybaseAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/sybase/SybaseAdapter.java
index 16f366748..ac68dde85 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/sybase/SybaseAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/sybase/SybaseAdapter.java
@@ -35,6 +35,7 @@ import org.apache.cayenne.configuration.RuntimeProperties;
 import org.apache.cayenne.dba.DefaultQuotingStrategy;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.dba.JdbcAdapter;
+import org.apache.cayenne.dba.PkGenerator;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.map.DbAttribute;
 
@@ -103,6 +104,14 @@ public class SybaseAdapter extends JdbcAdapter {
         return new SybaseEJBQLTranslator();
     }
 
+    /**
+     * Returns a {@link SybasePkGenerator}.
+     */
+    @Override
+    public PkGenerator createPkGenerator() {
+        return new SybasePkGenerator(this);
+    }
+
     /**
      * @since 4.2
      */
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/sybase/SybasePkGenerator.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/sybase/SybasePkGenerator.java
index a099d53f5..e5fe6bd9f 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/sybase/SybasePkGenerator.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/sybase/SybasePkGenerator.java
@@ -41,15 +41,7 @@ import java.util.List;
  */
 public class SybasePkGenerator extends JdbcPkGenerator {
 
-       /**
-        * Used by DI
-        * @since 4.1
-        */
-       public SybasePkGenerator(){
-               super();
-       }
-
-       protected SybasePkGenerator(JdbcAdapter adapter) {
+       public SybasePkGenerator(JdbcAdapter adapter) {
                super(adapter);
        }
 
diff --git a/cayenne/src/test/java/org/apache/cayenne/PregeneratedPKIT.java 
b/cayenne/src/test/java/org/apache/cayenne/PregeneratedPKIT.java
index dc910bc07..19c395e20 100644
--- a/cayenne/src/test/java/org/apache/cayenne/PregeneratedPKIT.java
+++ b/cayenne/src/test/java/org/apache/cayenne/PregeneratedPKIT.java
@@ -74,7 +74,7 @@ public class PregeneratedPKIT {
         DbEntity entity = context.getEntityResolver().getDbEntity("ARTIST");
         DataNode node = 
context.getParentDataDomain().lookupDataNode(entity.getDataMap());
 
-        Object pk = node.getAdapter().getPkGenerator().generatePk(
+        Object pk = node.getPkGenerator().generatePk(
                 node,
                 entity.getPrimaryKeys().iterator().next());
         id.getReplacementIdMap().put(Artist.ARTIST_ID_PK_COLUMN, pk);
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/DataContextExtrasIT.java 
b/cayenne/src/test/java/org/apache/cayenne/access/DataContextExtrasIT.java
index eee773d11..e7d35a042 100644
--- a/cayenne/src/test/java/org/apache/cayenne/access/DataContextExtrasIT.java
+++ b/cayenne/src/test/java/org/apache/cayenne/access/DataContextExtrasIT.java
@@ -25,7 +25,6 @@ import org.apache.cayenne.DataRow;
 import org.apache.cayenne.ObjectId;
 import org.apache.cayenne.PersistenceState;
 import org.apache.cayenne.Persistent;
-import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.JdbcAdapter;
 import org.apache.cayenne.dba.JdbcPkGenerator;
 import org.apache.cayenne.dba.PkGenerator;
@@ -258,19 +257,10 @@ public class DataContextExtrasIT {
             }
         };
 
-        PkGenerator oldGenerator = domain
-                .getDataNodes()
-                .iterator()
-                .next()
-                .getAdapter()
-                .getPkGenerator();
-        DbAdapter adapter = domain
-                .getDataNodes()
-                .iterator()
-                .next()
-                .getAdapter();
-
-        adapter.setPkGenerator(newGenerator);
+        DataNode node = domain.getDataNodes().iterator().next();
+        PkGenerator oldGenerator = node.getPkGenerator();
+
+        node.setPkGenerator(newGenerator);
         try {
             assertThrows(CayenneRuntimeException.class, () -> {
                 Artist newArtist = context.newObject(Artist.class);
@@ -278,7 +268,7 @@ public class DataContextExtrasIT {
                 context.commitChanges();
             });
         } finally {
-            adapter.setPkGenerator(oldGenerator);
+            node.setPkGenerator(oldGenerator);
         }
     }
 
diff --git a/cayenne/src/test/java/org/apache/cayenne/access/DataNodeIT.java 
b/cayenne/src/test/java/org/apache/cayenne/access/DataNodeIT.java
deleted file mode 100644
index d6c6464c2..000000000
--- a/cayenne/src/test/java/org/apache/cayenne/access/DataNodeIT.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*****************************************************************
- *   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
- *
- *    https://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.access;
-
-import org.apache.cayenne.dba.JdbcAdapter;
-import org.apache.cayenne.unit.CayenneProjects;
-import org.apache.cayenne.unit.CayenneTestsEnv;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertSame;
-
-public class DataNodeIT {
-
-    @RegisterExtension
-    static final CayenneTestsEnv env = 
CayenneTestsEnv.forProject(CayenneProjects.TESTMAP_PROJECT);
-
-    @Test
-    public void name() throws Exception {
-        String tstName = "tst_name";
-        DataNode node = new DataNode();
-        assertNull(node.getName());
-        node.setName(tstName);
-        assertEquals(tstName, node.getName());
-    }
-
-    @Test
-    public void dataSourceFactory() throws Exception {
-        String tstName = "tst_name";
-        DataNode node = new DataNode();
-        assertNull(node.getDataSourceFactory());
-        node.setDataSourceFactory(tstName);
-        assertEquals(tstName, node.getDataSourceFactory());
-    }
-
-    @Test
-    public void nodeEntityResolver() {
-        DataNode node = new DataNode();
-        assertNull(node.getEntityResolver());
-
-        org.apache.cayenne.map.EntityResolver resolver = new 
org.apache.cayenne.map.EntityResolver();
-        node.setEntityResolver(resolver);
-        assertSame(resolver, node.getEntityResolver());
-    }
-
-    @Test
-    public void adapter() throws Exception {
-        DataNode node = new DataNode();
-
-        assertNull(node.getAdapter());
-
-        JdbcAdapter a1 = env.adhocObjectFactory().newInstance(
-                JdbcAdapter.class, 
-                JdbcAdapter.class.getName());
-        node.setAdapter(a1);
-
-        assertSame(a1, node.getAdapter());
-
-        JdbcAdapter a2 = env.adhocObjectFactory().newInstance(
-                JdbcAdapter.class, 
-                JdbcAdapter.class.getName());
-        node.setAdapter(a2);
-
-        assertSame(a2, node.getAdapter());
-    }
-}
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/DataNodeQueriesIT.java 
b/cayenne/src/test/java/org/apache/cayenne/access/DataNodeQueriesIT.java
index 516e20f43..e81ba5548 100644
--- a/cayenne/src/test/java/org/apache/cayenne/access/DataNodeQueriesIT.java
+++ b/cayenne/src/test/java/org/apache/cayenne/access/DataNodeQueriesIT.java
@@ -69,12 +69,12 @@ public class DataNodeQueriesIT {
     public void createPkSupportForMapEntities() throws Exception {
 
         DbEntity artistEnt = node.getEntityResolver().getDbEntity("ARTIST");
-        assertNotNull(node.getAdapter().getPkGenerator().generatePk(
+        assertNotNull(node.getPkGenerator().generatePk(
                 node,
                 artistEnt.getPrimaryKeys().iterator().next()));
 
         DbEntity exhibitEnt = node.getEntityResolver().getDbEntity("EXHIBIT");
-        assertNotNull(node.getAdapter().getPkGenerator().generatePk(
+        assertNotNull(node.getPkGenerator().generatePk(
                 node,
                 exhibitEnt.getPrimaryKeys().iterator().next()));
     }
diff --git a/cayenne/src/test/java/org/apache/cayenne/access/DataNodeTest.java 
b/cayenne/src/test/java/org/apache/cayenne/access/DataNodeTest.java
new file mode 100644
index 000000000..02fd57b93
--- /dev/null
+++ b/cayenne/src/test/java/org/apache/cayenne/access/DataNodeTest.java
@@ -0,0 +1,114 @@
+/*****************************************************************
+ *   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
+ *
+ *    https://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.access;
+
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dba.PkGenerator;
+import org.apache.cayenne.map.EntityResolver;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class DataNodeTest {
+
+    @Test
+    public void name() {
+        DataNode node = new DataNode();
+        assertNull(node.getName());
+
+        node.setName("tst_name");
+        assertEquals("tst_name", node.getName());
+    }
+
+    @Test
+    public void dataSourceFactory() {
+        DataNode node = new DataNode();
+        assertNull(node.getDataSourceFactory());
+
+        node.setDataSourceFactory("tst_name");
+        assertEquals("tst_name", node.getDataSourceFactory());
+    }
+
+    @Test
+    public void entityResolver() {
+        DataNode node = new DataNode();
+        assertNull(node.getEntityResolver());
+
+        EntityResolver resolver = new EntityResolver();
+        node.setEntityResolver(resolver);
+        assertSame(resolver, node.getEntityResolver());
+    }
+
+    @Test
+    public void adapter() {
+        DataNode node = new DataNode();
+        assertNull(node.getAdapter());
+
+        DbAdapter a1 = mock(DbAdapter.class);
+        node.setAdapter(a1);
+        assertSame(a1, node.getAdapter());
+
+        DbAdapter a2 = mock(DbAdapter.class);
+        node.setAdapter(a2);
+        assertSame(a2, node.getAdapter());
+    }
+
+    @Test
+    public void pkGeneratorFollowsAdapter() {
+        DataNode node = new DataNode();
+        assertNull(node.getPkGenerator());
+
+        PkGenerator g1 = mock(PkGenerator.class);
+        node.setAdapter(adapterWithPkGenerator(g1));
+        assertSame(g1, node.getPkGenerator());
+
+        PkGenerator g2 = mock(PkGenerator.class);
+        node.setAdapter(adapterWithPkGenerator(g2));
+        assertSame(g2, node.getPkGenerator());
+    }
+
+    @Test
+    public void pkGeneratorCustomRetainedAcrossAdapterChange() {
+        DataNode node = new DataNode();
+        node.setAdapter(adapterWithPkGenerator(mock(PkGenerator.class)));
+
+        PkGenerator custom = mock(PkGenerator.class);
+        node.setPkGenerator(custom);
+        assertSame(custom, node.getPkGenerator());
+
+        PkGenerator adapterDefault = mock(PkGenerator.class);
+        node.setAdapter(adapterWithPkGenerator(adapterDefault));
+        assertSame(custom, node.getPkGenerator());
+
+        // null restores the adapter default
+        node.setPkGenerator(null);
+        assertSame(adapterDefault, node.getPkGenerator());
+    }
+
+    private DbAdapter adapterWithPkGenerator(PkGenerator pkGenerator) {
+        DbAdapter adapter = mock(DbAdapter.class);
+        when(adapter.createPkGenerator()).thenReturn(pkGenerator);
+        return adapter;
+    }
+}
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/IdentityColumnsIT.java 
b/cayenne/src/test/java/org/apache/cayenne/access/IdentityColumnsIT.java
index 844005e79..bcbbc9959 100644
--- a/cayenne/src/test/java/org/apache/cayenne/access/IdentityColumnsIT.java
+++ b/cayenne/src/test/java/org/apache/cayenne/access/IdentityColumnsIT.java
@@ -114,7 +114,7 @@ public class IdentityColumnsIT {
         // for comparison
         DbEntity joinTableEntity = 
env.context().getEntityResolver().getDbEntity(joinTable.getTableName());
         DbAttribute pkAttribute = joinTableEntity.getAttribute("ID");
-        Number pk = (Number) 
node.getAdapter().getPkGenerator().generatePk(node, pkAttribute);
+        Number pk = (Number) node.getPkGenerator().generatePk(node, 
pkAttribute);
 
         GeneratedF1 f1 = env.context().newObject(GeneratedF1.class);
         GeneratedF2 f2 = env.context().newObject(GeneratedF2.class);
diff --git a/cayenne/src/test/java/org/apache/cayenne/access/MockDataNode.java 
b/cayenne/src/test/java/org/apache/cayenne/access/MockDataNode.java
index 26d3b614d..887a9c696 100644
--- a/cayenne/src/test/java/org/apache/cayenne/access/MockDataNode.java
+++ b/cayenne/src/test/java/org/apache/cayenne/access/MockDataNode.java
@@ -28,6 +28,7 @@ import java.util.Map;
 import javax.sql.DataSource;
 
 import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dba.PkGenerator;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.EntitySorter;
@@ -117,6 +118,11 @@ public class MockDataNode extends DataNode {
         return node.getAdapter();
     }
 
+    @Override
+    public PkGenerator getPkGenerator() {
+        return node.getPkGenerator();
+    }
+
     @Override
     public Collection getDataMaps() {
         return node.getDataMaps();
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/configuration/runtime/DefaultDbAdapterFactoryTest.java
 
b/cayenne/src/test/java/org/apache/cayenne/configuration/runtime/DefaultDbAdapterFactoryTest.java
index fcaa476cb..93e3e196e 100644
--- 
a/cayenne/src/test/java/org/apache/cayenne/configuration/runtime/DefaultDbAdapterFactoryTest.java
+++ 
b/cayenne/src/test/java/org/apache/cayenne/configuration/runtime/DefaultDbAdapterFactoryTest.java
@@ -28,8 +28,6 @@ import org.apache.cayenne.configuration.RuntimeProperties;
 import org.apache.cayenne.dba.AutoAdapter;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.JdbcAdapter;
-import org.apache.cayenne.dba.JdbcPkGenerator;
-import org.apache.cayenne.dba.PkGenerator;
 import org.apache.cayenne.dba.sybase.SybaseAdapter;
 import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.di.ClassLoaderManager;
@@ -78,8 +76,6 @@ public class DefaultDbAdapterFactoryTest {
         Module testModule = binder -> {
             CoreModule.extend(binder).initAllExtensions();
 
-            binder.bind(PkGenerator.class).to(JdbcPkGenerator.class);
-            
binder.bind(PkGeneratorFactoryProvider.class).to(PkGeneratorFactoryProvider.class);
             binder.bind(SQLLogger.class).to(Slf4jSQLLogger.class);
             
binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
             
binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
@@ -108,8 +104,6 @@ public class DefaultDbAdapterFactoryTest {
 
             CoreModule.extend(b).initAllExtensions();
 
-            b.bind(PkGenerator.class).to(JdbcPkGenerator.class);
-            
b.bind(PkGeneratorFactoryProvider.class).to(PkGeneratorFactoryProvider.class);
             b.bind(SQLLogger.class).to(Slf4jSQLLogger.class);
             
b.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
             
b.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
@@ -145,8 +139,6 @@ public class DefaultDbAdapterFactoryTest {
         Module testModule = b -> {
             CoreModule.extend(b).initAllExtensions();
 
-            b.bind(PkGenerator.class).to(JdbcPkGenerator.class);
-            
b.bind(PkGeneratorFactoryProvider.class).to(PkGeneratorFactoryProvider.class);
             b.bind(SQLLogger.class).to(Slf4jSQLLogger.class);
             
b.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
             
b.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
@@ -189,8 +181,6 @@ public class DefaultDbAdapterFactoryTest {
         Module testModule = binder -> {
             CoreModule.extend(binder).initAllExtensions();
 
-            binder.bind(PkGenerator.class).to(JdbcPkGenerator.class);
-            
binder.bind(PkGeneratorFactoryProvider.class).to(PkGeneratorFactoryProvider.class);
             
binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
             binder.bind(SQLLogger.class).to(Slf4jSQLLogger.class);
             
binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
diff --git a/cayenne/src/test/java/org/apache/cayenne/dba/AutoAdapterIT.java 
b/cayenne/src/test/java/org/apache/cayenne/dba/AutoAdapterIT.java
index 709951f2d..a22ecd4fa 100644
--- a/cayenne/src/test/java/org/apache/cayenne/dba/AutoAdapterIT.java
+++ b/cayenne/src/test/java/org/apache/cayenne/dba/AutoAdapterIT.java
@@ -74,8 +74,9 @@ public class AutoAdapterIT {
                 autoAdapter.supportsGeneratedKeysForBatchInserts());
         assertSame(adapter.getBatchTerminator(),
                 autoAdapter.getBatchTerminator());
-        assertSame(adapter.getPkGenerator(),
-                autoAdapter.getPkGenerator());
+        // returns a new instance for each call
+        assertSame(adapter.createPkGenerator().getClass(),
+                autoAdapter.createPkGenerator().getClass());
         DbEntity artistDbEntity = 
env.dataNode().getEntityResolver().getObjEntity(Artist.class).getDbEntity();
         assertSame(adapter.getQuotingStrategy(artistDbEntity),
                 autoAdapter.getQuotingStrategy(artistDbEntity));
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/dba/JdbcPkGeneratorIT.java 
b/cayenne/src/test/java/org/apache/cayenne/dba/JdbcPkGeneratorIT.java
index 4f0286d8c..c3532de6e 100644
--- a/cayenne/src/test/java/org/apache/cayenne/dba/JdbcPkGeneratorIT.java
+++ b/cayenne/src/test/java/org/apache/cayenne/dba/JdbcPkGeneratorIT.java
@@ -40,12 +40,8 @@ public class JdbcPkGeneratorIT {
     @RegisterExtension
     static final CayenneTestsEnv env = 
CayenneTestsEnv.forProject(CayenneProjects.TESTMAP_PROJECT);
 
-    private DataNode node;
-
     @BeforeEach
     public void setUp() throws Exception {
-        node = env.dataNode();
-
         // TODO: we should have a dedicated DbSchemaManager for such 
destructive operations working off of its own DB
         CayenneTestsEnv.COMMON_SCHEMA.dropPKSupport();
     }
@@ -53,40 +49,34 @@ public class JdbcPkGeneratorIT {
     @AfterEach
     public void tearDown() throws Exception {
 
-        if 
(JdbcPkGenerator.class.isAssignableFrom(node.getAdapter().getPkGenerator().getClass()))
 {
-            // reset PK gen properly before updating PKs in DB
-            JdbcPkGenerator pkGenerator = (JdbcPkGenerator) 
node.getAdapter().getPkGenerator();
-
-            
pkGenerator.setPkStartValue(JdbcPkGenerator.DEFAULT_PK_START_VALUE);
+        // the test leaves PK support in the DB starting way past 
Integer.MAX_VALUE, so rebuild it for whoever runs
+        // next.
 
-            // TODO: we should have a dedicated DbSchemaManager for such 
destructive operations working off of its own DB
-            CayenneTestsEnv.COMMON_SCHEMA.dropPKSupport();
-            CayenneTestsEnv.COMMON_SCHEMA.createPKSupport();
-        }
+        // TODO: we should have a dedicated DbSchemaManager for such 
destructive operations working off of its own DB
+        CayenneTestsEnv.COMMON_SCHEMA.dropPKSupport();
+        CayenneTestsEnv.COMMON_SCHEMA.createPKSupport();
     }
 
     @Test
-    public void longPk() throws Exception {
+    public void longPk() {
 
-        if 
(!JdbcPkGenerator.class.isAssignableFrom(node.getAdapter().getPkGenerator().getClass()))
 {
-            return;
-        }
+        DataNode node = env.dataNode();
 
         DbEntity artistEntity = 
node.getEntityResolver().getObjEntity(Artist.class).getDbEntity();
-
         DbAttribute pkAttribute = 
artistEntity.getAttribute(Artist.ARTIST_ID_PK_COLUMN);
 
-        JdbcPkGenerator pkGenerator = (JdbcPkGenerator) 
node.getAdapter().getPkGenerator();
+        JdbcPkGenerator pkGenerator = (JdbcPkGenerator) node.getPkGenerator();
 
         pkGenerator.setPkStartValue(Integer.MAX_VALUE * 2L);
-        if 
(!JdbcPkGenerator.class.equals(node.getAdapter().getPkGenerator().getClass()) &&
-                       
!DerbyPkGenerator.class.equals(node.getAdapter().getPkGenerator().getClass())) 
{ // AUTO_PK_SUPPORT doesn't allow dropping PK support for a single entity
+        if (!JdbcPkGenerator.class.equals(node.getPkGenerator().getClass()) &&
+                // AUTO_PK_SUPPORT doesn't allow dropping PK support for a 
single entity
+                
!DerbyPkGenerator.class.equals(node.getPkGenerator().getClass())) {
             pkGenerator.dropAutoPk(node, 
Collections.singletonList(artistEntity));
         }
         pkGenerator.createAutoPk(node, 
Collections.singletonList(artistEntity));
         pkGenerator.reset();
-        
-        Object pk = pkGenerator.generatePk(node, pkAttribute);
+
+        Object pk = pkGenerator.generatePk(node, pkAttribute, null);
         assertInstanceOf(Long.class, pk);
         assertTrue((Long) pk > Integer.MAX_VALUE, "PK is too small: " + pk);
     }
diff --git a/cayenne/src/test/java/org/apache/cayenne/dba/PkGeneratorIT.java 
b/cayenne/src/test/java/org/apache/cayenne/dba/PkGeneratorIT.java
index d82c28af4..91d5731c6 100644
--- a/cayenne/src/test/java/org/apache/cayenne/dba/PkGeneratorIT.java
+++ b/cayenne/src/test/java/org/apache/cayenne/dba/PkGeneratorIT.java
@@ -50,7 +50,7 @@ public class PkGeneratorIT {
     public void setUp() throws Exception {
         accessStackAdapter = env.testDbAdapter();
         node = env.dataNode();
-        pkGenerator = node.getAdapter().getPkGenerator();
+        pkGenerator = node.getPkGenerator();
         paintingEntity = node.getEntityResolver().getDbEntity("PAINTING");
 
         List<DbEntity> list = new ArrayList<DbEntity>();
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/dba/SequencePkGeneratorTest.java 
b/cayenne/src/test/java/org/apache/cayenne/dba/SequencePkGeneratorTest.java
index f760fdedb..aaaa76f82 100644
--- a/cayenne/src/test/java/org/apache/cayenne/dba/SequencePkGeneratorTest.java
+++ b/cayenne/src/test/java/org/apache/cayenne/dba/SequencePkGeneratorTest.java
@@ -34,7 +34,8 @@ public class SequencePkGeneratorTest {
     @BeforeEach
     public void setUp() {
         // use a concrete subclass to exercise the shared sequence naming logic
-        pkGenerator = new OraclePkGenerator();
+        // (naming does not depend on the adapter)
+        pkGenerator = new OraclePkGenerator(null);
     }
 
     @Test
diff --git a/cayenne/src/test/java/org/apache/cayenne/unit/DbSchemaManager.java 
b/cayenne/src/test/java/org/apache/cayenne/unit/DbSchemaManager.java
index 314e42603..bf3bb4816 100644
--- a/cayenne/src/test/java/org/apache/cayenne/unit/DbSchemaManager.java
+++ b/cayenne/src/test/java/org/apache/cayenne/unit/DbSchemaManager.java
@@ -396,12 +396,12 @@ public class DbSchemaManager {
 
     private void dropPKSupport(DataNode node, DataMap map) throws Exception {
         List<DbEntity> filteredEntities = 
dbEntitiesInInsertOrder(map.getName());
-        node.getAdapter().getPkGenerator().dropAutoPk(node, filteredEntities);
+        node.getPkGenerator().dropAutoPk(node, filteredEntities);
     }
 
     private void createPKSupport(DataNode node, DataMap map) throws Exception {
         List<DbEntity> filteredEntities = 
dbEntitiesInInsertOrder(map.getName());
-        node.getAdapter().getPkGenerator().createAutoPk(node, 
filteredEntities);
+        node.getPkGenerator().createAutoPk(node, filteredEntities);
     }
 
     private void createSchema(DataNode node, DataMap map) throws Exception {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbmerge/MergerOptionsDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbmerge/MergerOptionsDialog.java
index 440919837..b94fe1847 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbmerge/MergerOptionsDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbmerge/MergerOptionsDialog.java
@@ -24,6 +24,7 @@ import com.jgoodies.forms.factories.Borders;
 import com.jgoodies.forms.layout.CellConstraints;
 import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbsync.merge.DataMapMerger;
 import org.apache.cayenne.dbsync.merge.context.MergeDirection;
@@ -222,10 +223,14 @@ public class MergerOptionsDialog extends ProjectDialog {
         String batchTerminator = adapter.getBatchTerminator();
         String lineEnd = batchTerminator != null ? "\n" + batchTerminator + 
"\n\n" : "\n\n";
 
+        // tokens generate SQL in the context of a DataNode. No DataSource is 
needed, as nothing is executed here
+        DataNode node = new DataNode();
+        node.setAdapter(adapter);
+
         while (it.hasNext()) {
             MergerToken token = it.next();
             if (token instanceof AbstractToDbToken tdb) {
-                for (String sql : tdb.createSql(adapter)) {
+                for (String sql : tdb.createSql(node)) {
                     buf.append(sql);
                     buf.append(lineEnd);
                 }

Reply via email to