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

commit 0c5819521803598dd4f985aa66944f6cbcef2968
Author: Andrus Adamchik <[email protected]>
AuthorDate: Sun Jul 19 18:30:32 2026 +0200

    NameBuilder cleanup
    
    switch instead of visitor for main operations
    always passing parent to the factory
---
 .../dbsync/merge/context/EntityMergeSupport.java   |   4 +-
 .../merge/token/model/AddRelationshipToModel.java  |   5 +-
 .../merge/token/model/CreateTableToModel.java      |   2 +-
 .../apache/cayenne/dbsync/naming/CallbackNode.java |  37 ++++
 .../dbsync/naming/DeduplicationVisitor.java        | 191 ---------------------
 .../dbsync/naming/DefaultBaseNameVisitor.java      | 116 -------------
 .../apache/cayenne/dbsync/naming/NameBuilder.java  | 187 +++++++++++++++-----
 .../dbsync/naming/NormalizationVisitor.java        | 117 -------------
 .../dbimport/ManyToManyCandidateEntity.java        |   2 +-
 .../dbsync/reverse/dbload/RelationshipLoader.java  |   2 +-
 .../cayenne/dbsync/naming/NameBuilderTest.java     |  70 ++++----
 .../modeler/ui/action/CreateAttributeAction.java   |   6 +-
 .../ui/action/CreateCallbackMethodAction.java      |   3 +-
 .../modeler/ui/action/CreateDataMapAction.java     |   2 +-
 .../modeler/ui/action/CreateDbEntityAction.java    |   2 +-
 .../modeler/ui/action/CreateEmbeddableAction.java  |   2 +-
 .../modeler/ui/action/CreateNodeAction.java        |   2 +-
 .../modeler/ui/action/CreateObjEntityAction.java   |   4 +-
 .../modeler/ui/action/CreateProcedureAction.java   |   2 +-
 .../ui/action/CreateProcedureParameterAction.java  |   2 +-
 .../modeler/ui/action/ImportDataMapAction.java     |   2 +-
 .../modeler/ui/action/ImportEOModelAction.java     |   2 +-
 .../modeler/ui/action/NewProjectAction.java        |   2 +-
 .../cayenne/modeler/ui/action/PasteAction.java     |  37 ++--
 .../autorelationship/InferRelationshipsDialog.java |   5 +-
 .../ui/dbrelationship/DbRelationshipDialog.java    |   6 +-
 .../relinfo/ObjRelationshipInfoDialog.java         |   2 +-
 .../ui/project/querytype/QueryTypeDialog.java      |   2 +-
 .../apache/cayenne/wocompat/EOModelProcessor.java  |   2 +-
 29 files changed, 268 insertions(+), 550 deletions(-)

diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/context/EntityMergeSupport.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/context/EntityMergeSupport.java
index 0fc341035..6f37b18b4 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/context/EntityMergeSupport.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/context/EntityMergeSupport.java
@@ -201,7 +201,7 @@ public class EntityMergeSupport {
 
     private boolean createObjRelationship(ObjEntity entity, DbRelationship dr, 
String targetEntityName) {
         ObjRelationship or = new ObjRelationship();
-        or.setName(NameBuilder.of(or).parent(entity)
+        or.setName(NameBuilder.of(or, entity)
                 .baseName(nameGenerator.relationshipName(dr))
                 .name());
 
@@ -268,7 +268,7 @@ public class EntityMergeSupport {
 
     private void addMissingAttribute(ObjEntity entity, DbAttribute da) {
         ObjAttribute oa = new ObjAttribute();
-        
oa.setName(NameBuilder.of(oa).parent(entity).baseName(nameGenerator.objAttributeName(da)).name());
+        oa.setName(NameBuilder.of(oa, 
entity).baseName(nameGenerator.objAttributeName(da)).name());
         oa.setEntity(entity);
         oa.setType(getTypeForObjAttribute(da));
         oa.setDbAttributePath(da.getName());
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddRelationshipToModel.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddRelationshipToModel.java
index 4c498af63..da4422c47 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddRelationshipToModel.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddRelationshipToModel.java
@@ -22,6 +22,7 @@ package org.apache.cayenne.dbsync.merge.token.model;
 import org.apache.cayenne.dbsync.merge.context.MergerContext;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
+import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbJoin;
 import org.apache.cayenne.map.DbRelationship;
@@ -67,7 +68,9 @@ public class AddRelationshipToModel extends 
AbstractToModelToken.Entity {
     public void execute(MergerContext context) {
         // Set name to relationship if it was created without it, e.g. in 
createReverse() action
         if (relationship.getName() == null) {
-            
relationship.setName(context.getNameGenerator().relationshipName(relationship));
+            relationship.setName(NameBuilder.of(relationship, getEntity())
+                    
.baseName(context.getNameGenerator().relationshipName(relationship))
+                    .name());
         }
 
         getEntity().addRelationship(relationship);
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/CreateTableToModel.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/CreateTableToModel.java
index 35f6405e3..c9d925522 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/CreateTableToModel.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/CreateTableToModel.java
@@ -65,7 +65,7 @@ public class CreateTableToModel extends 
AbstractToModelToken.Entity {
         ObjEntity objEntity = new ObjEntity();
 
         objEntity.setName(NameBuilder
-                .of(objEntity).parent(dbEntity.getDataMap())
+                .of(objEntity, dbEntity.getDataMap())
                 .baseName(context.getNameGenerator().objEntityName(dbEntity))
                 .name());
         objEntity.setDbEntity(getEntity());
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/CallbackNode.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/CallbackNode.java
new file mode 100644
index 000000000..7ce508503
--- /dev/null
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/CallbackNode.java
@@ -0,0 +1,37 @@
+/*
+ *    Licensed to the Apache Software Foundation (ASF) under one
+ *    or more contributor license agreements.  See the NOTICE file
+ *    distributed with this work for additional information
+ *    regarding copyright ownership.  The ASF licenses this file
+ *    to you under the Apache License, Version 2.0 (the
+ *    "License"); you may not use this file except in compliance
+ *    with the License.  You may obtain a copy of the License at
+ *
+ *      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.dbsync.naming;
+
+import org.apache.cayenne.configuration.ConfigurationNode;
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+
+/**
+ * A pseudo-node representing an {@link org.apache.cayenne.map.ObjEntity} 
callback method. Callback methods are not
+ * {@link ConfigurationNode}s in the model, so this stand-in lets them flow 
through the {@link NameBuilder} naming
+ * algorithm like any other node.
+ *
+ * @since 5.0
+ */
+public class CallbackNode implements ConfigurationNode {
+
+    @Override
+    public <T> T acceptVisitor(ConfigurationNodeVisitor<T> visitor) {
+        return null;
+    }
+}
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DeduplicationVisitor.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DeduplicationVisitor.java
deleted file mode 100644
index 7483a8bd0..000000000
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DeduplicationVisitor.java
+++ /dev/null
@@ -1,191 +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.dbsync.naming;
-
-import org.apache.cayenne.configuration.ConfigurationNode;
-import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.configuration.DataNodeDescriptor;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.Embeddable;
-import org.apache.cayenne.map.EmbeddableAttribute;
-import org.apache.cayenne.map.ObjAttribute;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.map.Procedure;
-import org.apache.cayenne.map.ProcedureParameter;
-import org.apache.cayenne.map.QueryDescriptor;
-
-import java.util.Objects;
-import java.util.function.Predicate;
-
-class DeduplicationVisitor implements ConfigurationNodeVisitor<String> {
-
-    private final ConfigurationNode parent;
-    private final String baseName;
-    private final String dupesPattern;
-
-    DeduplicationVisitor(ConfigurationNode parent, String baseName, String 
dupesPattern) {
-        this.parent = parent;
-        this.baseName = Objects.requireNonNull(baseName);
-        this.dupesPattern = Objects.requireNonNull(dupesPattern);
-    }
-
-    @Override
-    public String visitDataChannelDescriptor(DataChannelDescriptor 
channelDescriptor) {
-        // DataChannelDescriptor is top-level. No context or naming conflicts 
are expected...
-        return baseName;
-    }
-
-    @Override
-    public String visitDataNodeDescriptor(DataNodeDescriptor nodeDescriptor) {
-        return resolve(name -> {
-            DataChannelDescriptor dataChannelDescriptor = 
(DataChannelDescriptor) parent;
-            for (DataNodeDescriptor dataNodeDescriptor : 
dataChannelDescriptor.getNodeDescriptors()) {
-                if (dataNodeDescriptor.getName().equals(name)) {
-                    return true;
-                }
-            }
-
-            return false;
-        });
-    }
-
-    @Override
-    public String visitDataMap(DataMap dataMap) {
-        return resolve(name -> {
-            // null context is a situation when DataMap is a top level object 
of the project
-            if (parent == null) {
-                return false;
-            }
-
-            if (parent instanceof DataChannelDescriptor domain) {
-                return domain.getDataMap(name) != null;
-            }
-            return false;
-        });
-    }
-
-    @Override
-    public String visitObjEntity(ObjEntity entity) {
-        return resolve(name -> ((DataMap) parent).getObjEntity(name) != null);
-    }
-
-    @Override
-    public String visitDbEntity(DbEntity entity) {
-        return resolve(name -> ((DataMap) parent).getDbEntity(name) != null);
-    }
-
-    @Override
-    public String visitEmbeddable(Embeddable embeddable) {
-        return resolve(name -> {
-            DataMap map = (DataMap) parent;
-            return map.getEmbeddable(map.getNameWithDefaultPackage(name)) != 
null;
-        });
-    }
-
-    @Override
-    public String visitEmbeddableAttribute(EmbeddableAttribute attribute) {
-        return resolve(name -> ((Embeddable) parent).getAttribute(name) != 
null);
-    }
-
-    @Override
-    public String visitObjAttribute(ObjAttribute attribute) {
-        return resolveObjEntityProperty();
-    }
-
-    @Override
-    public String visitDbAttribute(DbAttribute attribute) {
-        return resolveDbEntityProperty();
-    }
-
-    @Override
-    public String visitObjRelationship(ObjRelationship relationship) {
-        return resolveObjEntityProperty();
-    }
-
-    @Override
-    public String visitDbRelationship(DbRelationship relationship) {
-        return resolveDbEntityProperty();
-    }
-
-    @Override
-    public String visitProcedure(Procedure procedure) {
-        return resolve(name -> ((DataMap) parent).getProcedure(name) != null);
-    }
-
-    @Override
-    public String visitProcedureParameter(ProcedureParameter parameter) {
-        return resolve(name -> {
-
-            // it doesn't matter if we create a parameter with a duplicate 
name.. parameters are positional anyway..
-            // still try to use unique names for visual consistency
-
-            Procedure procedure = (Procedure) parent;
-            for (ProcedureParameter parameter1 : 
procedure.getCallParameters()) {
-                if (name.equals(parameter1.getName())) {
-                    return true;
-                }
-            }
-
-            return false;
-        });
-    }
-
-    @Override
-    public String visitQuery(QueryDescriptor query) {
-        return resolve(name -> ((DataMap) parent).getQueryDescriptor(name) != 
null);
-    }
-
-    String resolve(Predicate<String> nameChecker) {
-        int c = 1;
-        String name = baseName;
-        while (nameChecker.test(name)) {
-            name = String.format(dupesPattern, baseName, c++);
-        }
-
-        return name;
-    }
-
-    private String resolveDbEntityProperty() {
-        return resolve(name -> {
-            DbEntity entity = (DbEntity) parent;
-            // check if either attribute or relationship name matches...
-            return entity.getAttribute(name) != null || 
entity.getRelationship(name) != null;
-        });
-    }
-
-    private String resolveObjEntityProperty() {
-        return resolve(name -> {
-            ObjEntity entity = (ObjEntity) parent;
-
-            // check if either attribute or relationship name matches...
-            if (entity.getAttribute(name) != null || 
entity.getRelationship(name) != null) {
-                return true;
-            }
-
-            //  check if there's a callback method that shadows attribute 
getter (unlikely, but still)
-            String conflictingCallback = "get" + NameUtil.capitalize(name);
-            return entity.getCallbackMethods().contains(conflictingCallback);
-        });
-    }
-}
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DefaultBaseNameVisitor.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DefaultBaseNameVisitor.java
deleted file mode 100644
index 5801bc0d4..000000000
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/DefaultBaseNameVisitor.java
+++ /dev/null
@@ -1,116 +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.dbsync.naming;
-
-import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.configuration.DataNodeDescriptor;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.Embeddable;
-import org.apache.cayenne.map.EmbeddableAttribute;
-import org.apache.cayenne.map.ObjAttribute;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.map.Procedure;
-import org.apache.cayenne.map.ProcedureParameter;
-import org.apache.cayenne.map.QueryDescriptor;
-
-/**
- * @since 4.0
- */
-class DefaultBaseNameVisitor implements ConfigurationNodeVisitor<String> {
-
-    static final DefaultBaseNameVisitor INSTANCE = new 
DefaultBaseNameVisitor();
-
-    private DefaultBaseNameVisitor() {
-    }
-
-    @Override
-    public String visitDataChannelDescriptor(DataChannelDescriptor 
channelDescriptor) {
-        return "project";
-    }
-
-    @Override
-    public String visitDataNodeDescriptor(DataNodeDescriptor nodeDescriptor) {
-        return "datanode";
-    }
-
-    @Override
-    public String visitDataMap(DataMap dataMap) {
-        return "datamap";
-    }
-
-    @Override
-    public String visitObjEntity(ObjEntity entity) {
-        return "ObjEntity";
-    }
-
-    @Override
-    public String visitDbEntity(DbEntity entity) {
-        return "db_entity";
-    }
-
-    @Override
-    public String visitEmbeddable(Embeddable embeddable) {
-        return "Embeddable";
-    }
-
-    @Override
-    public String visitEmbeddableAttribute(EmbeddableAttribute attribute) {
-        return "untitledAttr";
-    }
-
-    @Override
-    public String visitObjAttribute(ObjAttribute attribute) {
-        return "untitledAttr";
-    }
-
-    @Override
-    public String visitDbAttribute(DbAttribute attribute) {
-        return "untitledAttr";
-    }
-
-    @Override
-    public String visitObjRelationship(ObjRelationship relationship) {
-        return "untitledRel";
-    }
-
-    @Override
-    public String visitDbRelationship(DbRelationship relationship) {
-        return "untitledRel";
-    }
-
-    @Override
-    public String visitProcedure(Procedure procedure) {
-        return "procedure";
-    }
-
-    @Override
-    public String visitProcedureParameter(ProcedureParameter parameter) {
-        return "UntitledProcedureParameter";
-    }
-
-    @Override
-    public String visitQuery(QueryDescriptor query) {
-        return "query";
-    }
-}
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NameBuilder.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NameBuilder.java
index 638fe7dc9..be98020db 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NameBuilder.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NameBuilder.java
@@ -19,10 +19,23 @@
 package org.apache.cayenne.dbsync.naming;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
-import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.configuration.DataNodeDescriptor;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.EmbeddableAttribute;
+import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
+import org.apache.cayenne.map.Procedure;
+import org.apache.cayenne.map.ProcedureParameter;
+import org.apache.cayenne.map.QueryDescriptor;
 
 import java.util.Objects;
+import java.util.function.Predicate;
 
 /**
  * A builder of names for model objects. Ensures that newly generated names do 
not conflict with the names of siblings
@@ -33,30 +46,25 @@ import java.util.Objects;
  */
 public class NameBuilder {
 
-    public static NameBuilder of(ConfigurationNode node) {
-        return new NameBuilder(node);
-    }
-
-    // TODO: make callback a ConfigurationNode (or remove it from the model 
all together) to avoid a special case here
-    public static NameBuilder ofCallbackMethod() {
-        return new CallbackNameBuilder();
+    /**
+     * Creates a builder for naming the given node under the given parent. The 
parent may be null for a top-level
+     * node (such as a project root) that has no siblings to clash with.
+     */
+    public static NameBuilder of(ConfigurationNode node, ConfigurationNode 
parent) {
+        return new NameBuilder(node, parent);
     }
 
     private final ConfigurationNode nodeToName;
-    protected ConfigurationNode parent;
-    protected String dupesPattern;
-    protected String baseName;
+    private final ConfigurationNode parent;
+    private String dupesPattern;
+    private String baseName;
 
-    private NameBuilder(ConfigurationNode nodeToName) {
+    private NameBuilder(ConfigurationNode nodeToName, ConfigurationNode 
parent) {
         this.nodeToName = Objects.requireNonNull(nodeToName);
+        this.parent = parent;
         this.dupesPattern = "%s%d";
     }
 
-    public NameBuilder parent(ConfigurationNode parent) {
-        this.parent = Objects.requireNonNull(parent);
-        return this;
-    }
-
     public NameBuilder dupesPattern(String dupesPattern) {
         this.dupesPattern = Objects.requireNonNull(dupesPattern);
         return this;
@@ -70,50 +78,139 @@ public class NameBuilder {
     public String name() {
         String baseName = this.baseName != null && !this.baseName.isEmpty()
                 ? this.baseName
-                : nodeToName.acceptVisitor(DefaultBaseNameVisitor.INSTANCE);
+                : defaultBaseName(nodeToName);
 
-        String normalizedBaseName = nodeToName.acceptVisitor(new 
NormalizationVisitor(baseName));
-        return nodeToName.acceptVisitor(new DeduplicationVisitor(parent, 
normalizedBaseName, dupesPattern));
+        String normalizedBaseName = normalize(nodeToName, baseName);
+        return deduplicate(nodeToName, normalizedBaseName);
     }
 
-    static class CallbackNameBuilder extends NameBuilder {
+    private static String defaultBaseName(ConfigurationNode node) {
+        return switch (node) {
+            case DataChannelDescriptor ignored -> "project";
+            case DataNodeDescriptor ignored -> "datanode";
+            case DataMap ignored -> "datamap";
+            case ObjEntity ignored -> "ObjEntity";
+            case DbEntity ignored -> "db_entity";
+            case Embeddable ignored -> "Embeddable";
+            case EmbeddableAttribute ignored -> "untitledAttr";
+            case ObjAttribute ignored -> "untitledAttr";
+            case DbAttribute ignored -> "untitledAttr";
+            case ObjRelationship ignored -> "untitledRel";
+            case DbRelationship ignored -> "untitledRel";
+            case Procedure ignored -> "procedure";
+            case ProcedureParameter ignored -> "UntitledProcedureParameter";
+            case QueryDescriptor ignored -> "query";
+            case CallbackNode ignored -> "onEvent";
+            default -> throw new IllegalArgumentException("Unsupported node 
type: " + node.getClass().getName());
+        };
+    }
 
-        public CallbackNameBuilder() {
-            super(new CallbackNode());
+    private static String normalize(ConfigurationNode node, String baseName) {
+        return switch (node) {
+            case ObjEntity ignored -> NameUtil.capitalize(baseName);
+            case Embeddable ignored -> NameUtil.capitalize(baseName);
+            case EmbeddableAttribute ignored -> 
NameUtil.uncapitalize(baseName);
+            case ObjAttribute ignored -> NameUtil.uncapitalize(baseName);
+            case ObjRelationship ignored -> NameUtil.uncapitalize(baseName);
+            case DbRelationship ignored -> NameUtil.uncapitalize(baseName);
+            default -> baseName;
+        };
+    }
+
+    private String deduplicate(ConfigurationNode node, String baseName) {
+
+        // a top-level node (e.g. a DataChannelDescriptor or a project-level 
DataMap) has no siblings to clash with
+        if (parent == null) {
+            return baseName;
         }
 
-        @Override
-        public String name() {
-            String baseName = this.baseName != null
-                    ? this.baseName
-                    : "onEvent";
+        Predicate<String> nameChecker = switch (node) {
+            case DataNodeDescriptor ignored -> this::dataNodeExists;
+            case DataMap ignored -> name -> ((DataChannelDescriptor) 
parent).getDataMap(name) != null;
+            case ObjEntity ignored -> name -> ((DataMap) 
parent).getObjEntity(name) != null;
+            case DbEntity ignored -> name -> ((DataMap) 
parent).getDbEntity(name) != null;
+            case Embeddable ignored -> this::embeddableExists;
+            case EmbeddableAttribute ignored -> name -> ((Embeddable) 
parent).getAttribute(name) != null;
+            case ObjAttribute ignored -> this::objEntityPropertyExists;
+            case DbAttribute ignored -> this::dbEntityPropertyExists;
+            case ObjRelationship ignored -> this::objEntityPropertyExists;
+            case DbRelationship ignored -> this::dbEntityPropertyExists;
+            case Procedure ignored -> name -> ((DataMap) 
parent).getProcedure(name) != null;
+            case ProcedureParameter ignored -> this::procedureParameterExists;
+            case QueryDescriptor ignored -> name -> ((DataMap) 
parent).getQueryDescriptor(name) != null;
+            case CallbackNode ignored -> this::callbackMethodExists;
+            default -> throw new IllegalArgumentException("Unsupported node 
type: " + node.getClass().getName());
+        };
+
+        int c = 1;
+        String name = baseName;
+        while (nameChecker.test(name)) {
+            name = String.format(dupesPattern, baseName, c++);
+        }
+        return name;
+    }
 
-            return new DeduplicationVisitor(parent, baseName, 
dupesPattern).resolve(name -> {
+    private boolean dataNodeExists(String name) {
+        DataChannelDescriptor dataChannelDescriptor = (DataChannelDescriptor) 
parent;
+        for (DataNodeDescriptor dataNodeDescriptor : 
dataChannelDescriptor.getNodeDescriptors()) {
+            if (dataNodeDescriptor.getName().equals(name)) {
+                return true;
+            }
+        }
+        return false;
+    }
 
-                ObjEntity entity = (ObjEntity) parent;
+    private boolean embeddableExists(String name) {
+        DataMap map = (DataMap) parent;
+        return map.getEmbeddable(map.getNameWithDefaultPackage(name)) != null;
+    }
 
-                if (entity.getCallbackMethods().contains(name)) {
-                    return true;
-                }
+    private boolean procedureParameterExists(String name) {
+        // it doesn't matter if we create a parameter with a duplicate name. 
parameters are positional anyway.
+        // still try to use unique names for visual consistency
+        Procedure procedure = (Procedure) parent;
+        for (ProcedureParameter parameter : procedure.getCallParameters()) {
+            if (name.equals(parameter.getName())) {
+                return true;
+            }
+        }
+        return false;
+    }
 
-                if (name.startsWith("get")) {
-                    String conflictingProperty = 
NameUtil.uncapitalize(name.substring(3));
+    private boolean dbEntityPropertyExists(String name) {
+        DbEntity entity = (DbEntity) parent;
+        // check if either attribute or relationship name matches...
+        return entity.getAttribute(name) != null || 
entity.getRelationship(name) != null;
+    }
 
-                    // check if either attribute or relationship name 
matches...
-                    return entity.getAttribute(conflictingProperty) != null
-                            || entity.getRelationship(conflictingProperty) != 
null;
-                }
+    private boolean objEntityPropertyExists(String name) {
+        ObjEntity entity = (ObjEntity) parent;
 
-                return false;
-            });
+        // check if either attribute or relationship name matches...
+        if (entity.getAttribute(name) != null || entity.getRelationship(name) 
!= null) {
+            return true;
         }
+
+        //  check if there's a callback method that shadows attribute getter 
(unlikely, but still)
+        String conflictingCallback = "get" + NameUtil.capitalize(name);
+        return entity.getCallbackMethods().contains(conflictingCallback);
     }
 
-    static class CallbackNode implements ConfigurationNode {
+    private boolean callbackMethodExists(String name) {
+        ObjEntity entity = (ObjEntity) parent;
 
-        @Override
-        public <T> T acceptVisitor(ConfigurationNodeVisitor<T> visitor) {
-            return null;
+        if (entity.getCallbackMethods().contains(name)) {
+            return true;
         }
+
+        if (name.startsWith("get")) {
+            String conflictingProperty = 
NameUtil.uncapitalize(name.substring(3));
+
+            // check if either attribute or relationship name matches...
+            return entity.getAttribute(conflictingProperty) != null
+                    || entity.getRelationship(conflictingProperty) != null;
+        }
+
+        return false;
     }
 }
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NormalizationVisitor.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NormalizationVisitor.java
deleted file mode 100644
index 10ff0e442..000000000
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/naming/NormalizationVisitor.java
+++ /dev/null
@@ -1,117 +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.dbsync.naming;
-
-import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.configuration.DataNodeDescriptor;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.Embeddable;
-import org.apache.cayenne.map.EmbeddableAttribute;
-import org.apache.cayenne.map.ObjAttribute;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.map.Procedure;
-import org.apache.cayenne.map.ProcedureParameter;
-import org.apache.cayenne.map.QueryDescriptor;
-
-/**
- * @since 4.0
- */
-class NormalizationVisitor implements ConfigurationNodeVisitor<String> {
-
-    private String baseName;
-
-    public NormalizationVisitor(String baseName) {
-        this.baseName = baseName;
-    }
-
-    @Override
-    public String visitDataChannelDescriptor(DataChannelDescriptor 
channelDescriptor) {
-        return baseName;
-    }
-
-    @Override
-    public String visitDataNodeDescriptor(DataNodeDescriptor nodeDescriptor) {
-        return baseName;
-    }
-
-    @Override
-    public String visitDataMap(DataMap dataMap) {
-        return baseName;
-    }
-
-    @Override
-    public String visitObjEntity(ObjEntity entity) {
-        return NameUtil.capitalize(baseName);
-    }
-
-    @Override
-    public String visitDbEntity(DbEntity entity) {
-        return baseName;
-    }
-
-    @Override
-    public String visitEmbeddable(Embeddable embeddable) {
-        return NameUtil.capitalize(baseName);
-    }
-
-    @Override
-    public String visitEmbeddableAttribute(EmbeddableAttribute attribute) {
-        return NameUtil.uncapitalize(baseName);
-    }
-
-    @Override
-    public String visitObjAttribute(ObjAttribute attribute) {
-        return NameUtil.uncapitalize(baseName);
-    }
-
-    @Override
-    public String visitDbAttribute(DbAttribute attribute) {
-        return baseName;
-    }
-
-    @Override
-    public String visitObjRelationship(ObjRelationship relationship) {
-        return NameUtil.uncapitalize(baseName);
-    }
-
-    @Override
-    public String visitDbRelationship(DbRelationship relationship) {
-        return NameUtil.uncapitalize(baseName);
-    }
-
-    @Override
-    public String visitProcedure(Procedure procedure) {
-        return baseName;
-    }
-
-    @Override
-    public String visitProcedureParameter(ProcedureParameter parameter) {
-        return baseName;
-    }
-
-    @Override
-    public String visitQuery(QueryDescriptor query) {
-        return baseName;
-    }
-}
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ManyToManyCandidateEntity.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ManyToManyCandidateEntity.java
index e4e82848c..6b5954258 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ManyToManyCandidateEntity.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/ManyToManyCandidateEntity.java
@@ -100,7 +100,7 @@ class ManyToManyCandidateEntity {
 
         ObjRelationship newRelationship = new ObjRelationship();
         newRelationship.setName(NameBuilder
-                .of(newRelationship).parent(srcEntity)
+                .of(newRelationship, srcEntity)
                 .baseName(nameGenerator.relationshipName(rel1, rel2))
                 .name());
 
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/RelationshipLoader.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/RelationshipLoader.java
index 4baf6a095..1b224b2e5 100644
--- 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/RelationshipLoader.java
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/RelationshipLoader.java
@@ -104,7 +104,7 @@ public class RelationshipLoader extends AbstractLoader {
 
     private void setRelationshipName(DbEntity entity, DbRelationship 
relationship) {
         relationship.setName(NameBuilder
-                .of(relationship).parent(entity)
+                .of(relationship, entity)
                 .baseName(nameGenerator.relationshipName(relationship))
                 .name());
     }
diff --git 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/NameBuilderTest.java
 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/NameBuilderTest.java
index bf9288533..434b9ab36 100644
--- 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/NameBuilderTest.java
+++ 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/naming/NameBuilderTest.java
@@ -40,7 +40,7 @@ public class NameBuilderTest {
 
     @Test
     public void name_Root() {
-        assertEquals("project", NameBuilder.of(new 
DataChannelDescriptor()).name());
+        assertEquals("project", NameBuilder.of(new DataChannelDescriptor(), 
null).name());
     }
 
     @Test
@@ -48,22 +48,22 @@ public class NameBuilderTest {
         DataChannelDescriptor descriptor = new DataChannelDescriptor();
 
         DataMap m0 = new DataMap();
-        m0.setName(NameBuilder.of(m0).parent(descriptor).name());
+        m0.setName(NameBuilder.of(m0, descriptor).name());
         assertEquals("datamap", m0.getName());
         descriptor.getDataMaps().add(m0);
 
         DataMap m1 = new DataMap();
-        m1.setName(NameBuilder.of(m1).parent(descriptor).name());
+        m1.setName(NameBuilder.of(m1, descriptor).name());
         assertEquals("datamap1", m1.getName());
         descriptor.getDataMaps().add(m1);
 
         DataNodeDescriptor nd0 = new DataNodeDescriptor();
-        nd0.setName(NameBuilder.of(nd0).parent(descriptor).name());
+        nd0.setName(NameBuilder.of(nd0, descriptor).name());
         assertEquals("datanode", nd0.getName());
         descriptor.getNodeDescriptors().add(nd0);
 
         DataNodeDescriptor nd1 = new DataNodeDescriptor();
-        nd1.setName(NameBuilder.of(nd1).parent(descriptor).name());
+        nd1.setName(NameBuilder.of(nd1, descriptor).name());
         assertEquals("datanode1", nd1.getName());
         descriptor.getNodeDescriptors().add(nd1);
     }
@@ -75,62 +75,62 @@ public class NameBuilderTest {
         map.setDefaultPackage("com.foo");
 
         DbEntity de0 = new DbEntity();
-        de0.setName(NameBuilder.of(de0).parent(map).name());
+        de0.setName(NameBuilder.of(de0, map).name());
         assertEquals("db_entity", de0.getName());
         map.addDbEntity(de0);
 
         DbEntity de1 = new DbEntity();
-        de1.setName(NameBuilder.of(de1).parent(map).name());
+        de1.setName(NameBuilder.of(de1, map).name());
         assertEquals("db_entity1", de1.getName());
         map.addDbEntity(de1);
 
         ObjEntity oe0 = new ObjEntity();
-        oe0.setName(NameBuilder.of(oe0).parent(map).name());
+        oe0.setName(NameBuilder.of(oe0, map).name());
         assertEquals("ObjEntity", oe0.getName());
         map.addObjEntity(oe0);
 
         ObjEntity oe1 = new ObjEntity();
-        oe1.setName(NameBuilder.of(oe1).parent(map).name());
+        oe1.setName(NameBuilder.of(oe1, map).name());
         assertEquals("ObjEntity1", oe1.getName());
         map.addObjEntity(oe1);
 
         ObjEntity oe2 = new ObjEntity();
-        
oe2.setName(NameBuilder.of(oe0).parent(map).baseName("db_entity").name());
+        oe2.setName(NameBuilder.of(oe0, map).baseName("db_entity").name());
         assertEquals("Db_entity", oe2.getName(), "Should not conflict with 
similarly named DbEntity");
         map.addObjEntity(oe2);
 
         Procedure p0 = new Procedure();
-        p0.setName(NameBuilder.of(p0).parent(map).name());
+        p0.setName(NameBuilder.of(p0, map).name());
         assertEquals("procedure", p0.getName());
         map.addProcedure(p0);
 
         Procedure p1 = new Procedure();
-        p1.setName(NameBuilder.of(p1).parent(map).name());
+        p1.setName(NameBuilder.of(p1, map).name());
         assertEquals("procedure1", p1.getName());
         map.addProcedure(p1);
 
         Procedure p2 = new Procedure();
-        p2.setName(NameBuilder.of(p1).parent(map).baseName("db_enity").name());
+        p2.setName(NameBuilder.of(p1, map).baseName("db_enity").name());
         assertEquals("db_enity", p2.getName(), "Should not conflict with 
similarly named DbEntity");
         map.addProcedure(p2);
 
         QueryDescriptor q0 = QueryDescriptor.selectQueryDescriptor();
-        q0.setName(NameBuilder.of(q0).parent(map).name());
+        q0.setName(NameBuilder.of(q0, map).name());
         assertEquals("query", q0.getName());
         map.addQueryDescriptor(q0);
 
         QueryDescriptor q1 = QueryDescriptor.ejbqlQueryDescriptor();
-        q1.setName(NameBuilder.of(q1).parent(map).name());
+        q1.setName(NameBuilder.of(q1, map).name());
         assertEquals("query1", q1.getName());
         map.addQueryDescriptor(q1);
 
         Embeddable e0 = new Embeddable();
-        e0.setClassName("com.foo." + NameBuilder.of(e0).parent(map).name());
+        e0.setClassName("com.foo." + NameBuilder.of(e0, map).name());
         assertEquals("com.foo.Embeddable", e0.getClassName());
         map.addEmbeddable(e0);
 
         Embeddable e1 = new Embeddable();
-        e1.setClassName("com.foo." + NameBuilder.of(e1).parent(map).name());
+        e1.setClassName("com.foo." + NameBuilder.of(e1, map).name());
         assertEquals("com.foo.Embeddable1", e1.getClassName());
         map.addEmbeddable(e1);
     }
@@ -143,31 +143,31 @@ public class NameBuilderTest {
         entity.getCallbackMap().getPostAdd().addCallbackMethod("getMe");
 
         ObjAttribute a0 = new ObjAttribute();
-        String na0 = NameBuilder.of(a0).parent(entity).name();
+        String na0 = NameBuilder.of(a0, entity).name();
         assertEquals("untitledAttr", na0);
         a0.setName(na0);
         entity.addAttribute(a0);
 
         ObjAttribute a1 = new ObjAttribute();
-        String na1 = NameBuilder.of(a1).parent(entity).name();
+        String na1 = NameBuilder.of(a1, entity).name();
         assertEquals("untitledAttr1", na1);
         a1.setName(na1);
         entity.addAttribute(a1);
 
         ObjAttribute a2 = new ObjAttribute();
-        String na2 = NameBuilder.of(a2).parent(entity).baseName("me").name();
+        String na2 = NameBuilder.of(a2, entity).baseName("me").name();
         assertEquals("me1", na2, "Conflict with callback method was not 
detected");
         a2.setName(na2);
         entity.addAttribute(a2);
 
         ObjRelationship r0 = new ObjRelationship();
-        String nr0 = NameBuilder.of(r0).parent(entity).name();
+        String nr0 = NameBuilder.of(r0, entity).name();
         assertEquals("untitledRel", nr0);
         r0.setName(nr0);
         entity.addRelationship(r0);
 
         ObjRelationship r1 = new ObjRelationship();
-        String nr1 = NameBuilder.of(r1).parent(entity).name();
+        String nr1 = NameBuilder.of(r1, entity).name();
         assertEquals("untitledRel1", nr1);
         r1.setName(nr1);
         entity.addRelationship(r1);
@@ -178,25 +178,25 @@ public class NameBuilderTest {
         DbEntity entity = new DbEntity();
 
         DbAttribute a0 = new DbAttribute();
-        String na0 = NameBuilder.of(a0).parent(entity).name();
+        String na0 = NameBuilder.of(a0, entity).name();
         assertEquals("untitledAttr", na0);
         a0.setName(na0);
         entity.addAttribute(a0);
 
         DbAttribute a1 = new DbAttribute();
-        String na1 = NameBuilder.of(a1).parent(entity).name();
+        String na1 = NameBuilder.of(a1, entity).name();
         assertEquals("untitledAttr1", na1);
         a1.setName(na1);
         entity.addAttribute(a1);
 
         DbRelationship r0 = new DbRelationship();
-        String nr0 = NameBuilder.of(r0).parent(entity).name();
+        String nr0 = NameBuilder.of(r0, entity).name();
         assertEquals("untitledRel", nr0);
         r0.setName(nr0);
         entity.addRelationship(r0);
 
         DbRelationship r1 = new DbRelationship();
-        String nr1 = NameBuilder.of(r1).parent(entity).name();
+        String nr1 = NameBuilder.of(r1, entity).name();
         assertEquals("untitledRel1", nr1);
         r1.setName(nr1);
         entity.addRelationship(r1);
@@ -207,12 +207,12 @@ public class NameBuilderTest {
         Procedure procedure = new Procedure();
 
         ProcedureParameter p0 = new ProcedureParameter();
-        p0.setName(NameBuilder.of(p0).parent(procedure).name());
+        p0.setName(NameBuilder.of(p0, procedure).name());
         assertEquals("UntitledProcedureParameter", p0.getName());
         procedure.addCallParameter(p0);
 
         ProcedureParameter p1 = new ProcedureParameter();
-        p1.setName(NameBuilder.of(p1).parent(procedure).name());
+        p1.setName(NameBuilder.of(p1, procedure).name());
         assertEquals("UntitledProcedureParameter1", p1.getName());
         procedure.addCallParameter(p1);
     }
@@ -222,12 +222,12 @@ public class NameBuilderTest {
         Embeddable embeddable = new Embeddable();
 
         EmbeddableAttribute ea0 = new EmbeddableAttribute();
-        ea0.setName(NameBuilder.of(ea0).parent(embeddable).name());
+        ea0.setName(NameBuilder.of(ea0, embeddable).name());
         assertEquals("untitledAttr", ea0.getName());
         embeddable.addAttribute(ea0);
 
         EmbeddableAttribute ea1 = new EmbeddableAttribute();
-        ea1.setName(NameBuilder.of(ea1).parent(embeddable).name());
+        ea1.setName(NameBuilder.of(ea1, embeddable).name());
         assertEquals("untitledAttr1", ea1.getName());
         embeddable.addAttribute(ea1);
     }
@@ -238,13 +238,13 @@ public class NameBuilderTest {
         ObjEntity entity = new ObjEntity();
 
         ObjAttribute a0 = new ObjAttribute();
-        String na0 = 
NameBuilder.of(a0).parent(entity).baseName("myName").name();
+        String na0 = NameBuilder.of(a0, entity).baseName("myName").name();
         assertEquals("myName", na0);
         a0.setName(na0);
         entity.addAttribute(a0);
 
         ObjAttribute a1 = new ObjAttribute();
-        String na1 = 
NameBuilder.of(a1).parent(entity).baseName("MyName").name();
+        String na1 = NameBuilder.of(a1, entity).baseName("MyName").name();
         assertEquals("myName1", na1);
         a1.setName(na1);
         entity.addAttribute(a1);
@@ -255,17 +255,17 @@ public class NameBuilderTest {
 
         ObjEntity entity = new ObjEntity();
 
-        String c0 = NameBuilder.ofCallbackMethod().parent(entity).name();
+        String c0 = NameBuilder.of(new CallbackNode(), entity).name();
         assertEquals("onEvent", c0);
         entity.getCallbackMap().getPostAdd().addCallbackMethod(c0);
 
-        String c1 = NameBuilder.ofCallbackMethod().parent(entity).name();
+        String c1 = NameBuilder.of(new CallbackNode(), entity).name();
         assertEquals("onEvent1", c1);
         entity.getCallbackMap().getPostAdd().addCallbackMethod(c1);
 
         entity.addAttribute(new ObjAttribute("untitledAttr"));
 
-        String c3 = 
NameBuilder.ofCallbackMethod().parent(entity).baseName("getUntitledAttr").name();
+        String c3 = NameBuilder.of(new CallbackNode(), 
entity).baseName("getUntitledAttr").name();
         assertEquals("getUntitledAttr1", c3);
         entity.getCallbackMap().getPostAdd().addCallbackMethod(c3);
     }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateAttributeAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateAttributeAction.java
index deaa71cb8..fbf5f8185 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateAttributeAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateAttributeAction.java
@@ -110,7 +110,7 @@ public class CreateAttributeAction extends AppAction {
 
             EmbeddableAttribute attr = new EmbeddableAttribute();
             attr.setName(NameBuilder
-                    .of(attr).parent(embeddable)
+                    .of(attr, embeddable)
                     .name());
 
             createEmbAttribute(embeddable, attr);
@@ -124,7 +124,7 @@ public class CreateAttributeAction extends AppAction {
             ObjEntity objEntity = session.getSelectedObjEntity();
 
             ObjAttribute attr = new ObjAttribute();
-            attr.setName(NameBuilder.of(attr).parent(objEntity).name());
+            attr.setName(NameBuilder.of(attr, objEntity).name());
 
             createObjAttribute(session.getSelectedDataMap(), objEntity, attr);
 
@@ -135,7 +135,7 @@ public class CreateAttributeAction extends AppAction {
             DbEntity dbEntity = getProjectSession().getSelectedDbEntity();
 
             DbAttribute attr = new DbAttribute();
-            attr.setName(NameBuilder.of(attr).parent(dbEntity).name());
+            attr.setName(NameBuilder.of(attr, dbEntity).name());
             attr.setType(TypesMapping.NOT_DEFINED);
             attr.setEntity(dbEntity);
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateCallbackMethodAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateCallbackMethodAction.java
index 5597addec..469e7d2e6 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateCallbackMethodAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateCallbackMethodAction.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.ui.action;
 
+import org.apache.cayenne.dbsync.naming.CallbackNode;
 import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.map.CallbackMap;
 import org.apache.cayenne.map.LifecycleEvent;
@@ -56,7 +57,7 @@ public class CreateCallbackMethodAction extends AppAction {
         CallbackType callbackType = 
getProjectSession().getSelectedCallbackType();
 
         String methodName = NameBuilder
-                
.ofCallbackMethod().parent(getProjectSession().getSelectedObjEntity())
+                .of(new CallbackNode(), 
getProjectSession().getSelectedObjEntity())
                 .baseName(toMethodName(callbackType.getType()))
                 .name();
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDataMapAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDataMapAction.java
index 691715069..8d384946f 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDataMapAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDataMapAction.java
@@ -73,7 +73,7 @@ public class CreateDataMapAction extends AppAction {
                 .getRootNode();
 
         DataMap map = new DataMap();
-        map.setName(NameBuilder.of(map).parent(dataChannelDescriptor).name());
+        map.setName(NameBuilder.of(map, dataChannelDescriptor).name());
         onMapCreated(this, getProjectSession(), map);
 
         app.getUndoManager().addEdit(new 
CreateDataMapUndoableEdit(getProjectSession(), dataChannelDescriptor, map));
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDbEntityAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDbEntityAction.java
index 606cd1feb..d9ffabdce 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDbEntityAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDbEntityAction.java
@@ -63,7 +63,7 @@ public class CreateDbEntityAction extends AppAction {
     public void performAction(ActionEvent e) {
         DataMap map = getProjectSession().getSelectedDataMap();
         DbEntity entity = new DbEntity();
-        entity.setName(NameBuilder.of(entity).parent(map).name());
+        entity.setName(NameBuilder.of(entity, map).name());
         createEntity(map, entity);
 
         app.getUndoManager().addEdit(new 
CreateDbEntityUndoableEdit(getProjectSession(), map, entity));
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateEmbeddableAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateEmbeddableAction.java
index 26e4d1944..cb4c4cb18 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateEmbeddableAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateEmbeddableAction.java
@@ -68,7 +68,7 @@ public class CreateEmbeddableAction extends AppAction {
         DataMap dataMap = getProjectSession().getSelectedDataMap();
 
         Embeddable embeddable = new Embeddable();
-        String baseName = NameBuilder.of(embeddable).parent(dataMap).name();
+        String baseName = NameBuilder.of(embeddable, dataMap).name();
         String nameWithPackage = dataMap.getNameWithDefaultPackage(baseName);
         embeddable.setClassName(nameWithPackage);
         createEmbeddable(dataMap, embeddable);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateNodeAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateNodeAction.java
index 92c105ef9..dd7bb5f06 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateNodeAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateNodeAction.java
@@ -91,7 +91,7 @@ public class CreateNodeAction extends AppAction {
      */
     DataNodeDescriptor buildDataNode(DataChannelDescriptor 
dataChannelDescriptor) {
         DataNodeDescriptor node = new DataNodeDescriptor();
-        
node.setName(NameBuilder.of(node).parent(dataChannelDescriptor).name());
+        node.setName(NameBuilder.of(node, dataChannelDescriptor).name());
         node.setDataChannelDescriptor(dataChannelDescriptor);
 
         return node;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateObjEntityAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateObjEntityAction.java
index f0ca27c81..56062ade1 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateObjEntityAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateObjEntityAction.java
@@ -76,7 +76,7 @@ public class CreateObjEntityAction extends AppAction {
 
         DataMap dataMap = session.getSelectedDataMap();
         ObjEntity entity = new ObjEntity();
-        entity.setName(NameBuilder.of(entity).parent(dataMap).name());
+        entity.setName(NameBuilder.of(entity, dataMap).name());
 
         // init defaults
         entity.setSuperClassName(dataMap.getDefaultSuperclass());
@@ -89,7 +89,7 @@ public class CreateObjEntityAction extends AppAction {
             // TODO: use injectable name generator
             String baseName = new 
DefaultObjectNameGenerator(NoStemStemmer.getInstance()).objEntityName(dbEntity);
             entity.setName(NameBuilder
-                    .of(entity).parent(dbEntity.getDataMap())
+                    .of(entity, dbEntity.getDataMap())
                     .baseName(baseName)
                     .name());
         }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureAction.java
index 3507c76c3..a82edfa1b 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureAction.java
@@ -61,7 +61,7 @@ public class CreateProcedureAction extends AppAction {
         DataMap map = getProjectSession().getSelectedDataMap();
 
         Procedure procedure = new Procedure();
-        procedure.setName(NameBuilder.of(procedure).parent(map).name());
+        procedure.setName(NameBuilder.of(procedure, map).name());
         createProcedure(map, procedure);
 
         app.getUndoManager().addEdit(new 
CreateProcedureUndoableEdit(getProjectSession(), map, procedure));
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureParameterAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureParameterAction.java
index 703c1c554..6b134bf56 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureParameterAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureParameterAction.java
@@ -71,7 +71,7 @@ public class CreateProcedureParameterAction extends AppAction 
{
         if (getProjectSession().getSelectedProcedure() != null) {
             Procedure procedure = getProjectSession().getSelectedProcedure();
             ProcedureParameter parameter = new ProcedureParameter();
-            
parameter.setName(NameBuilder.of(parameter).parent(procedure).name());
+            parameter.setName(NameBuilder.of(parameter, procedure).name());
 
             createProcedureParameter(procedure, parameter);
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java
index e515145ff..66a34c342 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java
@@ -78,7 +78,7 @@ public class ImportDataMapAction extends AppAction {
 
             ConfigurationNode root = 
getProjectSession().project().getRootNode();
             newMap.setName(NameBuilder
-                    .of(newMap).parent(root)
+                    .of(newMap, root)
                     .baseName(newMap.getName())
                     .name());
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
index 61bad0719..f9e4e4041 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
@@ -285,7 +285,7 @@ public class ImportEOModelAction extends AppAction {
             // fix DataMap name, as there maybe a map with the same name 
already
             ConfigurationNode root = session.project().getRootNode();
             map.setName(NameBuilder
-                    .of(map).parent(root)
+                    .of(map, root)
                     .baseName(map.getName())
                     .name());
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NewProjectAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NewProjectAction.java
index 397bca333..46e5acf4e 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NewProjectAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NewProjectAction.java
@@ -61,7 +61,7 @@ public class NewProjectAction extends AppAction {
         DataChannelDescriptor dataChannelDescriptor = new 
DataChannelDescriptor();
 
         dataChannelDescriptor.setName(NameBuilder
-                .of(dataChannelDescriptor)
+                .of(dataChannelDescriptor, null)
                 .name());
 
         Project project = new Project(new 
ConfigurationTree<>(dataChannelDescriptor));
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/PasteAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/PasteAction.java
index dd09b1851..540b8a9ef 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/PasteAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/PasteAction.java
@@ -21,6 +21,7 @@ package org.apache.cayenne.modeler.ui.action;
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
+import org.apache.cayenne.dbsync.naming.CallbackNode;
 import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbAttribute;
@@ -158,7 +159,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
             // paste DataMap to DataDomain or DataNode
 
             dataMap.setName(NameBuilder
-                    .of(dataMap).parent(dataChannelDescriptor)
+                    .of(dataMap, dataChannelDescriptor)
                     .baseName(dataMap.getName())
                     .dupesPattern(COPY_PATTERN)
                     .name());
@@ -173,7 +174,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
             for (DbEntity dbEntity : dataMap.getDbEntities()) {
                 String oldName = dbEntity.getName();
                 dbEntity.setName(NameBuilder
-                        .of(dbEntity).parent(dataMap)
+                        .of(dbEntity, dataMap)
                         .baseName(dbEntity.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -186,7 +187,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
             for (ObjEntity objEntity : dataMap.getObjEntities()) {
                 String oldName = objEntity.getName();
                 objEntity.setName(NameBuilder
-                        .of(objEntity).parent(dataMap)
+                        .of(objEntity, dataMap)
                         .baseName(objEntity.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -198,7 +199,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
 
             for (Embeddable embeddable : dataMap.getEmbeddables()) {
                 embeddable.setClassName(NameBuilder
-                        .of(embeddable).parent(dataMap)
+                        .of(embeddable, dataMap)
                         .baseName(embeddable.getClassName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -206,14 +207,14 @@ public class PasteAction extends AppAction implements 
FlavorListener {
 
             for (Procedure procedure : dataMap.getProcedures()) {
                 procedure.setName(NameBuilder
-                        .of(procedure).parent(dataMap)
+                        .of(procedure, dataMap)
                         .baseName(procedure.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
             }
 
             for (QueryDescriptor query : dataMap.getQueryDescriptors()) {
-                query.setName(NameBuilder.of(query).parent(dataMap)
+                query.setName(NameBuilder.of(query, dataMap)
                         .baseName(query.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -256,7 +257,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
 
             if (content instanceof DbEntity dbEntity) {
                 dbEntity.setName(NameBuilder
-                        .of(dbEntity).parent(dataMap)
+                        .of(dbEntity, dataMap)
                         .baseName(dbEntity.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -265,7 +266,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
                 CreateDbEntityAction.onDbEntityCreated(this, session, 
dbEntity);
             } else if (content instanceof ObjEntity objEntity) {
                 // paste ObjEntity to DataMap
-                objEntity.setName(NameBuilder.of(objEntity).parent(dataMap)
+                objEntity.setName(NameBuilder.of(objEntity, dataMap)
                         .baseName(objEntity.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -279,7 +280,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
             } else if (content instanceof Embeddable embeddable) {
                 // paste Embeddable to DataMap
                 embeddable.setClassName(NameBuilder
-                        .of(embeddable).parent(dataMap)
+                        .of(embeddable, dataMap)
                         .baseName(embeddable.getClassName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -293,7 +294,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
             } else if (content instanceof QueryDescriptor query) {
 
                 query.setName(NameBuilder
-                        .of(query).parent(dataMap)
+                        .of(query, dataMap)
                         .dupesPattern(COPY_PATTERN)
                         .baseName(query.getName())
                         .name());
@@ -304,7 +305,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
             } else if (content instanceof Procedure procedure) {
                 // paste Procedure to DataMap
                 procedure.setName(NameBuilder
-                        .of(procedure).parent(dataMap)
+                        .of(procedure, dataMap)
                         .dupesPattern(COPY_PATTERN)
                         .baseName(procedure.getName())
                         .name());
@@ -320,7 +321,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
 
             if (content instanceof DbAttribute attr) {
                 attr.setName(NameBuilder
-                        .of(attr).parent(dbEntity)
+                        .of(attr, dbEntity)
                         .dupesPattern(COPY_PATTERN)
                         .baseName(attr.getName())
                         .name());
@@ -330,7 +331,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
                         .getSelectedDataMap(), dbEntity, attr);
             } else if (content instanceof DbRelationship rel) {
                 rel.setName(NameBuilder
-                        .of(rel).parent(dbEntity)
+                        .of(rel, dbEntity)
                         .baseName(rel.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -346,7 +347,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
 
             if (content instanceof ObjAttribute attr) {
                 attr.setName(NameBuilder
-                        .of(attr).parent(objEntity)
+                        .of(attr, objEntity)
                         .baseName(attr.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -356,7 +357,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
                         .getSelectedDataMap(), objEntity, attr);
             } else if (content instanceof ObjRelationship rel) {
                 rel.setName(NameBuilder
-                        .of(rel).parent(objEntity)
+                        .of(rel, objEntity)
                         .baseName(rel.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -370,7 +371,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
             } else if (content instanceof ObjCallbackMethod method) {
 
                 method.setName(NameBuilder
-                        .ofCallbackMethod().parent(objEntity)
+                        .of(new CallbackNode(), objEntity)
                         .baseName(method.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -387,7 +388,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
 
             if (content instanceof EmbeddableAttribute attr) {
                 attr.setName(NameBuilder
-                        .of(attr).parent(embeddable)
+                        .of(attr, embeddable)
                         .baseName(attr.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
@@ -406,7 +407,7 @@ public class PasteAction extends AppAction implements 
FlavorListener {
             if (content instanceof ProcedureParameter param) {
 
                 param.setName(NameBuilder
-                        .of(param).parent(procedure)
+                        .of(param, procedure)
                         .baseName(param.getName())
                         .dupesPattern(COPY_PATTERN)
                         .name());
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsDialog.java
index 80c76a438..521ee7c2b 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsDialog.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.ui.autorelationship;
 
+import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.dbsync.naming.ObjectNameGenerator;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbAttribute;
@@ -310,7 +311,9 @@ public class InferRelationshipsDialog extends ProjectDialog 
{
                 
localRelationship.setTargetEntityName(myir.getSource().getName());
             }
 
-            myir.setName(strategy.relationshipName(localRelationship));
+            myir.setName(NameBuilder.of(localRelationship, 
localRelationship.getSourceEntity())
+                    .baseName(strategy.relationshipName(localRelationship))
+                    .name());
         }
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbRelationshipDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbRelationshipDialog.java
index bdecb3f23..3cf676afd 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbRelationshipDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbRelationshipDialog.java
@@ -93,7 +93,7 @@ public class DbRelationshipDialog extends ProjectDialog {
 
     public static Optional<DbRelationship> openForCreate(ProjectSession 
session, Window owner, DbEntity sourceEntity) {
         DbRelationship relationship = new DbRelationship();
-        
relationship.setName(NameBuilder.of(relationship).parent(sourceEntity).name());
+        relationship.setName(NameBuilder.of(relationship, 
sourceEntity).name());
         relationship.setSourceEntity(sourceEntity);
 
         DbRelationshipDialog dialog = new DbRelationshipDialog(session, owner, 
relationship, true);
@@ -347,7 +347,7 @@ public class DbRelationshipDialog extends ProjectDialog {
             if (reverse == null) {
                 reverse = new DbRelationship();
                 reverse.setName(NameBuilder
-                        .of(reverse).parent(relationship.getTargetEntity())
+                        .of(reverse, relationship.getTargetEntity())
                         .baseName(reverseName.getText().trim())
                         .name());
 
@@ -455,7 +455,7 @@ public class DbRelationshipDialog extends ProjectDialog {
         }
 
         String newName = NameBuilder
-                .of(rel).parent(rel.getSourceEntity())
+                .of(rel, rel.getSourceEntity())
                 .baseName(userInputName)
                 .name();
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoDialog.java
index 5cfafbaed..9dc5a5624 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoDialog.java
@@ -139,7 +139,7 @@ public class ObjRelationshipInfoDialog extends 
ProjectDialog implements TreeSele
 
     public ObjRelationshipInfoDialog createRelationship(ObjEntity objEntity) {
         ObjRelationship rel = new ObjRelationship();
-        rel.setName(NameBuilder.of(rel).parent(objEntity).name());
+        rel.setName(NameBuilder.of(rel, objEntity).name());
         rel.setSourceEntity(objEntity);
         DeleteRuleUpdater.updateObjRelationship(rel);
         isCreate = true;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/querytype/QueryTypeDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/querytype/QueryTypeDialog.java
index 3ab4c555e..4447fa14b 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/querytype/QueryTypeDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/querytype/QueryTypeDialog.java
@@ -115,7 +115,7 @@ public class QueryTypeDialog extends ProjectDialog {
 
     private void createQuery() {
         QueryDescriptor query = 
QueryDescriptor.descriptor(selectedQueryType());
-        query.setName(NameBuilder.of(query).parent(dataMap).name());
+        query.setName(NameBuilder.of(query, dataMap).name());
         query.setDataMap(dataMap);
 
         dataMap.addQueryDescriptor(query);
diff --git 
a/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java
 
b/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java
index cc7b78fa8..5dda1e7dc 100644
--- 
a/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java
+++ 
b/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java
@@ -684,7 +684,7 @@ public class EOModelProcessor {
 
                        if (relationship.getReverseRelationship() == null) {
                                DbRelationship reverse = 
relationship.createReverseRelationship();
-                               
reverse.setName(NameBuilder.of(reverse).parent(reverse.getSourceEntity())
+                               reverse.setName(NameBuilder.of(reverse, 
reverse.getSourceEntity())
                                                // TODO: we can do better with 
ObjectNameGenerator
                                                
.baseName(relationship.getName() + "Reverse")
                                                .name());

Reply via email to