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);