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()); + } + +}