This is an automated email from the ASF dual-hosted git repository.

johnthuss pushed a commit to branch ics17
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit e4b0a1bdd46cd5f359acd6a09968e457e499a6be
Author: Arseni Bulatski <ancars...@gmail.com>
AuthorDate: Wed Jan 9 13:14:49 2019 +0300

    CAY-2509 Result of resolving lazily faulted relationships can be out-of-date
---
 RELEASE-NOTES.txt                                  | 11 +++
 .../org/apache/cayenne/util/RelationshipFault.java |  4 +-
 .../java/org/apache/cayenne/access/CAY2509IT.java  | 99 ++++++++++++++++++++++
 3 files changed, 113 insertions(+), 1 deletion(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 792c1cf..2c87e92 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -40,6 +40,17 @@ CAY-2635 Lambda expressions break ROP serialization
 Release: 4.1.RC1
 Date: October 3, 2019
 ----------------------------------
+Changes/New Features:
+
+CAY-2467 New type-aware Property API
+CAY-2507 Property API to use path aliases
+
+Bug Fixes:
+
+CAY-2332 Property API: unable to use eq() and in() methods for toMany 
relationships
+CAY-2509 Result of resolving lazily faulted relationships can be out-of-date
+
+----------------------------------
 
 Changes/New Features:
 CAY-2592 Modeler: make all datamaps selected in global cgen tab
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/util/RelationshipFault.java 
b/cayenne-server/src/main/java/org/apache/cayenne/util/RelationshipFault.java
index d154a4d..00b5229 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/util/RelationshipFault.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/util/RelationshipFault.java
@@ -24,6 +24,7 @@ import java.util.List;
 
 import org.apache.cayenne.PersistenceState;
 import org.apache.cayenne.Persistent;
+import org.apache.cayenne.access.DataDomain;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
@@ -87,8 +88,9 @@ public abstract class RelationshipFault<E> {
             return new ArrayList<>();
         }
 
+        boolean refresh = relationshipOwner.getObjectContext().getChannel() 
instanceof DataDomain;
         List<E> resolved = relationshipOwner.getObjectContext().performQuery(
-                new RelationshipQuery(relationshipOwner.getObjectId(), 
relationshipName, false));
+                new RelationshipQuery(relationshipOwner.getObjectId(), 
relationshipName, refresh));
 
         /*
          * Duplicating the list (see CAY-1194). Doing that only for
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/CAY2509IT.java 
b/cayenne-server/src/test/java/org/apache/cayenne/access/CAY2509IT.java
new file mode 100644
index 0000000..1cca694
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/CAY2509IT.java
@@ -0,0 +1,99 @@
+package org.apache.cayenne.access;
+
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.List;
+
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.ObjectSelect;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.testdo.testmap.Artist;
+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.Test;
+
+import static org.junit.Assert.assertEquals;
+
+@UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
+public class CAY2509IT extends ServerCase {
+
+    @Inject
+    private ServerRuntime runtime;
+
+    @Inject
+    private DBHelper dbHelper;
+
+    private TableHelper tArtist;
+    private TableHelper tPainting;
+
+    @Before
+    public void before() {
+        this.tArtist = new TableHelper(dbHelper, 
"ARTIST").setColumns("ARTIST_ID", "ARTIST_NAME", "DATE_OF_BIRTH")
+                .setColumnTypes(Types.BIGINT, Types.CHAR, Types.DATE);
+        this.tPainting = new TableHelper(dbHelper, 
"PAINTING").setColumns("PAINTING_ID", "ARTIST_ID", "PAINTING_TITLE")
+                .setColumnTypes(Types.INTEGER, Types.BIGINT, Types.VARCHAR);
+    }
+
+    @Test
+    public void testSelectionProblem() throws SQLException {
+        tArtist.insert(1, "A1", null);
+        tPainting.insert(1, 1, "P1");
+        ObjectContext context1 = runtime.newContext();
+        List<Artist> artists1 = ObjectSelect.query(Artist.class)
+                .select(context1);
+        assertEquals("P1", 
artists1.get(0).getPaintingArray().get(0).getPaintingTitle());
+
+        tPainting.update()
+                .set("PAINTING_TITLE", "P2")
+                .where("PAINTING_ID", 1)
+                .execute();
+
+        ObjectContext context2 = runtime.newContext();
+        List<Artist> artists2 = ObjectSelect.query(Artist.class)
+                .select(context2);
+        assertEquals("P2", 
artists2.get(0).getPaintingArray().get(0).getPaintingTitle());
+    }
+
+    @Test
+    public void testChangesInTwoContexts() throws SQLException {
+        tArtist.insert(1, "A1", null);
+        ObjectContext context1 = runtime.newContext();
+        Artist artist = ObjectSelect.query(Artist.class)
+                .where(Artist.ARTIST_NAME.eq("A1"))
+                .selectFirst(context1);
+        assertEquals("A1", artist.getArtistName());
+        artist.setArtistName("A2");
+        assertEquals("A2", artist.getArtistName());
+
+        ObjectContext context2 = runtime.newContext();
+        List<Artist> artists = ObjectSelect.query(Artist.class)
+                .select(context2);
+        assertEquals(1, artists.size());
+        assertEquals("A1", artists.get(0).getArtistName());
+    }
+
+    @Test
+    public void testChangesInChildContext() throws SQLException {
+        tArtist.insert(1, "A1", null);
+        ObjectContext parentContext1 = runtime.newContext();
+        ObjectContext context1 = runtime.newContext(parentContext1);
+        Artist artist = ObjectSelect.query(Artist.class)
+                .where(Artist.ARTIST_NAME.eq("A1"))
+                .selectFirst(context1);
+        assertEquals("A1", artist.getArtistName());
+        artist.setArtistName("A2");
+        context1.commitChangesToParent();
+
+        ObjectContext parentContext2 = runtime.newContext();
+        List<Artist> artists = ObjectSelect.query(Artist.class)
+                .select(parentContext2);
+        assertEquals(1, artists.size());
+        assertEquals("A1", artists.get(0).getArtistName());
+    }
+
+}

Reply via email to