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

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


The following commit(s) were added to refs/heads/STABLE-4.2 by this push:
     new 53c9408e0 CAY-2777 Reverse relationship is not set with single table 
inheritance
53c9408e0 is described below

commit 53c9408e026d926601baf6e68b9761489c273397
Author: Nikita Timofeev <stari...@gmail.com>
AuthorDate: Thu Dec 22 16:23:12 2022 +0300

    CAY-2777 Reverse relationship is not set with single table inheritance
---
 .../access/flush/operation/OpIdFactory.java        |  4 ++-
 .../flush/DefaultDataDomainFlushActionTest.java    | 30 +++++++++++++++++++++-
 2 files changed, 32 insertions(+), 2 deletions(-)

diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/flush/operation/OpIdFactory.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/flush/operation/OpIdFactory.java
index 930cbd1bf..b29d9e1f6 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/flush/operation/OpIdFactory.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/flush/operation/OpIdFactory.java
@@ -31,8 +31,10 @@ import java.util.Objects;
  */
 public class OpIdFactory {
 
+    private static final String DB_PREFIX = "db:";
+
     static public ObjectId idForOperation(ObjectId originalId) {
-        if(originalId.isReplacementIdAttached()) {
+        if(originalId.isReplacementIdAttached() && 
originalId.getEntityName().startsWith(DB_PREFIX)) {
             return new ReplacementAwareObjectId(originalId);
         } else {
             return originalId;
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/flush/DefaultDataDomainFlushActionTest.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/access/flush/DefaultDataDomainFlushActionTest.java
index 6fe5781eb..9f1b0c30a 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/access/flush/DefaultDataDomainFlushActionTest.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/access/flush/DefaultDataDomainFlushActionTest.java
@@ -27,7 +27,6 @@ import java.util.List;
 import org.apache.cayenne.ObjectId;
 import org.apache.cayenne.PersistenceState;
 import org.apache.cayenne.Persistent;
-import org.apache.cayenne.access.flush.DefaultDataDomainFlushAction;
 import org.apache.cayenne.access.flush.operation.BaseDbRowOp;
 import org.apache.cayenne.access.flush.operation.DbRowOp;
 import org.apache.cayenne.access.flush.operation.DeleteDbRowOp;
@@ -91,6 +90,35 @@ public class DefaultDataDomainFlushActionTest {
         assertThat(merged, not(hasItem(sameInstance(op[9]))));
     }
 
+    @Test
+    public void mergeSameObjectsId_ReplacementId() {
+        ObjectId id1  = ObjectId.of("db:test2");
+        id1.getReplacementIdMap().put("id", 1);
+        ObjectId id2  = ObjectId.of("db:test");
+        id2.getReplacementIdMap().put("id", 1);
+        ObjectId id3  = ObjectId.of("db:test");
+        id3.getReplacementIdMap().put("id", 1);
+        ObjectId id4  = ObjectId.of("db:test");
+        id4.getReplacementIdMap().put("id", 2);
+
+        DbEntity test = mockEntity("test");
+        DbEntity test2 = mockEntity("test2");
+        BaseDbRowOp[] op = new BaseDbRowOp[4];
+        op[0] = new InsertDbRowOp(mockObject(id1),  test2, id1); // +
+        op[1] = new InsertDbRowOp(mockObject(id2),  test,  id2); // -
+        op[2] = new DeleteDbRowOp(mockObject(id3),  test,  id3); // -
+        op[3] = new UpdateDbRowOp(mockObject(id4),  test,  id4); // +
+
+        DefaultDataDomainFlushAction action = 
mock(DefaultDataDomainFlushAction.class);
+        when(action.mergeSameObjectIds((List<DbRowOp>) 
any(List.class))).thenCallRealMethod();
+
+        Collection<DbRowOp> merged = action.mergeSameObjectIds(new 
ArrayList<>(Arrays.asList(op)));
+        assertEquals(3, merged.size());
+
+        assertThat(merged, hasItems(op[0], op[2], op[3]));
+        assertThat(merged, not(hasItem(sameInstance(op[1]))));
+    }
+
     @Test
     public void createQueries() {
         ObjectId id1  = ObjectId.of("test",  "id", 1);

Reply via email to