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