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

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

commit 249b4a08e9ecdbe8cc23e2a17d57e97bf157531c
Author: Andrus Adamchik <[email protected]>
AuthorDate: Thu Jun 11 19:02:57 2026 -0400

    CAY-2960 Undoing renamed relationship change throws
---
 RELEASE-NOTES.txt                                         |  1 +
 .../modeler/ui/dbrelationship/DbRelationshipDialog.java   | 15 ++++++++++++---
 .../cayenne/modeler/undo/RelationshipUndoableEdit.java    |  5 ++++-
 3 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index a002a2091..c08229e56 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -20,6 +20,7 @@ Bug Fixes:
 
 CAY-2958 Empty join is saved
 CAY-2959 Modeler: DbRelationship dialog "Cancel" doesn't cancel
+CAY-2960 Undoing renamed relationship change throws
 
 ----------------------------------
 Release: 5.0-M2
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 377342a53..8a1d5184c 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
@@ -399,16 +399,25 @@ public class DbRelationshipDialog extends ProjectDialog {
             return;
         }
 
-        String sourceEntityName = NameBuilder
+        String newName = NameBuilder
                 .builder(rel, rel.getSourceEntity())
                 .baseName(userInputName)
                 .name();
 
-        if (Objects.equals(sourceEntityName, rel.getName())) {
+        if (Objects.equals(newName, rel.getName())) {
             return;
         }
         String oldName = rel.getName();
-        rel.setName(sourceEntityName);
+
+        // the entity maps relationships by name, so an attached relationship 
must be re-keyed, not just renamed
+        DbEntity sourceEntity = rel.getSourceEntity();
+        if (sourceEntity.getRelationship(oldName) == rel) {
+            sourceEntity.removeRelationship(oldName);
+            rel.setName(newName);
+            sourceEntity.addRelationship(rel);
+        } else {
+            rel.setName(newName);
+        }
 
         session.fireDbRelationshipEvent(DbRelationshipEvent.ofChange(this, 
rel, rel.getSourceEntity(), oldName));
     }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RelationshipUndoableEdit.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RelationshipUndoableEdit.java
index 0b2a7aac9..b7c41913b 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RelationshipUndoableEdit.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RelationshipUndoableEdit.java
@@ -19,6 +19,7 @@
 package org.apache.cayenne.modeler.undo;
 
 import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbJoin;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
@@ -102,7 +103,9 @@ public class RelationshipUndoableEdit extends 
CayenneUndoableEdit {
                rel.setToMany(dbRelationship.isToMany());
                rel.setTargetEntityName(dbRelationship.getTargetEntityName());
                rel.setSourceEntity(dbRelationship.getSourceEntity());
-               rel.setJoins(rel.getJoins());
+               rel.setJoins(dbRelationship.getJoins().stream()
+                               .map(j -> new DbJoin(rel, j.getSourceName(), 
j.getTargetName()))
+                               .toList());
                return rel;
        }
 

Reply via email to