You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2019/04/17 06:59:18 UTC

[cayenne] branch STABLE-4.1 updated: CAY-2566 Flush action generates update for PK attribute in case of toDepPK relationship

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

ntimofeev pushed a commit to branch STABLE-4.1
in repository https://gitbox.apache.org/repos/asf/cayenne.git


The following commit(s) were added to refs/heads/STABLE-4.1 by this push:
     new e8772c0  CAY-2566 Flush action generates update for PK attribute in case of toDepPK relationship
e8772c0 is described below

commit e8772c0aa5f1ef3c4aa74948108284c39354cca5
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Wed Apr 17 09:54:42 2019 +0300

    CAY-2566 Flush action generates update for PK attribute in case of toDepPK relationship
---
 RELEASE-NOTES.txt                                  |  2 ++
 .../cayenne/access/DataDomainDBDiffBuilder.java    | 13 ++++++++---
 .../apache/cayenne/access/IdentityColumnsIT.java   | 27 ++++++++++++++++++----
 3 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index d81100a..539574a 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -12,10 +12,12 @@ Release: 4.1.B2
 Date:
 ----------------------------------
 Bug Fixes:
+
 CAY-2550 Modeler: ObjAttribute inspector modifies wrong columns in attribute table
 CAY-2559 Modeler: Warning dialog shows wrong information after changing target entity in dbRelationship
 CAY-2561 Modeler: cgen type combobox doesn't set templates
 CAY-2564 No import for Property after generation classes with pk properties
+CAY-2566 Flush action generates update for PK attribute in case of toDepPK relationship
 
 ----------------------------------
 Release: 4.1.B1
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainDBDiffBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainDBDiffBuilder.java
index 80db9c5..e3878f0 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainDBDiffBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainDBDiffBuilder.java
@@ -33,6 +33,7 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
@@ -178,7 +179,9 @@ class DataDomainDBDiffBuilder implements GraphChangeHandler {
             }
 
         } else {
-            if (!relationship.isToMany() && relationship.isToPK()) {
+            List<DbRelationship> dbRelationships = relationship.getDbRelationships();
+            DbRelationship lastDbRelationship = dbRelationships.get(dbRelationships.size() - 1);
+            if (!relationship.isToMany() && lastDbRelationship.isToPK() && !lastDbRelationship.isToDependentPK()) {
                 doArcCreated(targetNodeId, arcId);
             }
         }
@@ -209,8 +212,12 @@ class DataDomainDBDiffBuilder implements GraphChangeHandler {
                 throw new IllegalArgumentException("Bad arcId: " + arcId);
             }
 
-        } else if (!relationship.isSourceIndependentFromTargetChange()) {
-            doArcDeleted(targetNodeId, arcId);
+        } else {
+            List<DbRelationship> dbRelationships = relationship.getDbRelationships();
+            DbRelationship lastDbRelationship = dbRelationships.get(dbRelationships.size() - 1);
+            if (!relationship.isToMany() && lastDbRelationship.isToPK() && !lastDbRelationship.isToDependentPK()) {
+                doArcDeleted(targetNodeId, arcId);
+            }
         }
     }
 
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/IdentityColumnsIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/IdentityColumnsIT.java
index c072c62..fda8c32 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/IdentityColumnsIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/IdentityColumnsIT.java
@@ -20,6 +20,7 @@
 package org.apache.cayenne.access;
 
 import org.apache.cayenne.Cayenne;
+import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.ObjectId;
 import org.apache.cayenne.Persistent;
@@ -45,10 +46,7 @@ import org.junit.Test;
 
 import java.util.List;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 @UseServerRuntime(CayenneProjects.GENERATED_PROJECT)
 public class IdentityColumnsIT extends ServerCase {
@@ -339,4 +337,25 @@ public class IdentityColumnsIT extends ServerCase {
         assertNotNull(Cayenne.objectForPK(context, GeneratedColumnTestEntity.class, id1));
         assertNotNull(Cayenne.objectForPK(context, GeneratedColumnDep.class, id2));
     }
+
+    /**
+     * This will fail if commit will attempt to update generated PK.
+     * See CAY-2566.
+     */
+    @Test
+    public void testUpdateMasterEntity() {
+        GeneratedColumnTestEntity idObject = context.newObject(GeneratedColumnTestEntity.class);
+        idObject.setName("aaa");
+        context.commitChanges();
+
+        GeneratedColumnDep dependent = context.newObject(GeneratedColumnDep.class);
+        dependent.setName("aaa");
+        dependent.setToMaster(idObject);
+
+        try {
+            context.commitChanges();
+        } catch(CayenneRuntimeException ex) {
+            fail("Commit should succeed");
+        }
+    }
 }