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 9c8ad5bfd CAY-2851 Replace Existing OneToOne From New Object
9c8ad5bfd is described below

commit 9c8ad5bfdfc26c89bee03cbfd2e8f688e1d38ac7
Author: Nikita Timofeev <stari...@gmail.com>
AuthorDate: Wed Jun 12 12:02:32 2024 +0400

    CAY-2851 Replace Existing OneToOne From New Object
---
 RELEASE-NOTES.txt                                  |  1 +
 .../cayenne/commitlog/CommitLogFilterIT.java       |  6 +--
 .../java/org/apache/cayenne/BaseDataObject.java    |  4 ++
 .../java/org/apache/cayenne/CDOOne2ManyIT.java     | 43 +++++++++++++++++++++-
 .../java/org/apache/cayenne/CDOOneDep2OneIT.java   |  2 -
 5 files changed, 47 insertions(+), 9 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index d35334dcf..1126bf59a 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -30,6 +30,7 @@ CAY-2841 Multi column ColumnSelect with SHARED_CACHE fails 
after 1st select
 CAY-2844 Joint prefetch doesn't use ObjEntity qualifier
 CAY-2848 Vertical Inheritance: Updating one-to-many with inverse nullifies 
other columns
 CAY-2850 Query using Clob comparison with empty String fails
+CAY-2851 Replace Existing OneToOne From New Object
 CAY-2853 Incorrect deletion of entities from flattened attributes
 
 ----------------------------------
diff --git 
a/cayenne-commitlog/src/test/java/org/apache/cayenne/commitlog/CommitLogFilterIT.java
 
b/cayenne-commitlog/src/test/java/org/apache/cayenne/commitlog/CommitLogFilterIT.java
index 8c2de9f1c..e75f07a6e 100644
--- 
a/cayenne-commitlog/src/test/java/org/apache/cayenne/commitlog/CommitLogFilterIT.java
+++ 
b/cayenne-commitlog/src/test/java/org/apache/cayenne/commitlog/CommitLogFilterIT.java
@@ -243,11 +243,8 @@ public class CommitLogFilterIT extends AuditableServerCase 
{
         verify(mockListener).onPostCommit(any(ObjectContext.class), 
changeMap.capture());
 
         assertNotNull(changeMap.getValue());
-        // TODO: this assertions would fail, once CAY-2851 is fixed
-        assertEquals(4, changeMap.getValue().getUniqueChanges().size());
+        assertEquals(5, changeMap.getValue().getUniqueChanges().size());
 
-        // TODO: commented out until CAY-2851 is fixed
-        /*
         ObjectChange a1c = changeMap.getValue().getChanges().get(
             ObjectId.of("Auditable1", Auditable1.ID_PK_COLUMN, 1));
         assertNotNull(a1c);
@@ -263,7 +260,6 @@ public class CommitLogFilterIT extends AuditableServerCase {
         ToManyRelationshipChange a2c1 = 
a2c.getToManyRelationshipChanges().get(Auditable1.CHILDREN1.getName());
         assertEquals(0, a2c1.getAdded().size());
         assertEquals(1, a2c1.getRemoved().size());
-         */
 
         ObjectChange ac1c = changeMap.getValue().getChanges().get(
                 ObjectId.of("AuditableChild1", AuditableChild1.ID_PK_COLUMN, 
1));
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/BaseDataObject.java 
b/cayenne-server/src/main/java/org/apache/cayenne/BaseDataObject.java
index 3b8eec657..acd291638 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/BaseDataObject.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/BaseDataObject.java
@@ -428,6 +428,10 @@ public abstract class BaseDataObject extends 
PersistentObject implements DataObj
                 .getRelationship(relName);
         ObjRelationship revRel = rel.getReverseRelationship();
         if (revRel != null) {
+            Object oldTarget = val.readProperty(revRel.getName());
+            if (oldTarget != this && oldTarget instanceof DataObject && val 
instanceof BaseDataObject) {
+                
((BaseDataObject)val).unsetReverseRelationship(revRel.getName(), (DataObject) 
oldTarget);
+            }
             if (revRel.isToMany()) {
                 val.addToManyTarget(revRel.getName(), this, false);
             } else {
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/CDOOne2ManyIT.java 
b/cayenne-server/src/test/java/org/apache/cayenne/CDOOne2ManyIT.java
index 34dbb4b1d..1f8ac4fb5 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/CDOOne2ManyIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/CDOOne2ManyIT.java
@@ -35,7 +35,6 @@ import org.apache.cayenne.unit.di.server.CayenneProjects;
 import org.apache.cayenne.unit.di.server.ServerCase;
 import org.apache.cayenne.unit.di.server.UseServerRuntime;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 
 import java.util.Date;
@@ -296,7 +295,6 @@ public class CDOOne2ManyIT extends ServerCase {
         context.commitChanges();
     }
 
-    @Ignore("See CAY-2851 for details")
     @Test
     public void testReplace() {
 
@@ -340,4 +338,45 @@ public class CDOOne2ManyIT extends ServerCase {
         assertEquals(1, g3.getPaintingArray().size());
         assertSame(p3, g3.getPaintingArray().get(0));
     }
+
+    @Test
+    public void testReplaceToSame() {
+
+        Painting p1 = context.newObject(Painting.class);
+        p1.setPaintingTitle("xa");
+
+        Gallery g1 = context.newObject(Gallery.class);
+        g1.setGalleryName("yTW");
+
+        p1.setToGallery(g1);
+
+        context.commitChanges();
+        ObjectContext context2 = runtime.newContext();
+
+        // test database data
+        Painting p2 = ObjectSelect.query(Painting.class).selectOne(context2);
+        Gallery g21 = p2.getToGallery();
+        assertNotNull(g21);
+        assertEquals("yTW", g21.getGalleryName());
+        assertEquals(1, g21.getPaintingArray().size());
+        assertSame(p2, g21.getPaintingArray().get(0));
+
+        g21.addToPaintingArray(p2);
+
+        // test before save
+        assertEquals(2, g21.getPaintingArray().size());
+        assertSame(p2, g21.getPaintingArray().get(0));
+
+        // do save II
+        context2.commitChanges();
+
+        ObjectContext context3 = runtime.newContext();
+
+        Painting p3 = ObjectSelect.query(Painting.class).selectOne(context3);
+        Gallery g3 = p3.getToGallery();
+        assertNotNull(g3);
+        assertEquals("yTW", g3.getGalleryName());
+        assertEquals(1, g3.getPaintingArray().size());
+        assertSame(p3, g3.getPaintingArray().get(0));
+    }
 }
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/CDOOneDep2OneIT.java 
b/cayenne-server/src/test/java/org/apache/cayenne/CDOOneDep2OneIT.java
index c91fca5cf..b288b4d35 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/CDOOneDep2OneIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/CDOOneDep2OneIT.java
@@ -29,7 +29,6 @@ import org.apache.cayenne.testdo.testmap.Painting;
 import org.apache.cayenne.testdo.testmap.PaintingInfo;
 import org.apache.cayenne.unit.di.server.CayenneProjects;
 import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Ignore;
 import org.junit.Test;
 
 import java.sql.Timestamp;
@@ -146,7 +145,6 @@ public class CDOOneDep2OneIT extends CayenneDOTestBase {
 
     }
 
-    @Ignore("See CAY-2851 for details")
     @Test
     public void testReplaceOtherSide() throws Exception {
         String altPaintingName = "alt painting";

Reply via email to