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 <[email protected]>
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);