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