Andrus Adamchik created CAY-2877: ------------------------------------ Summary: Don't reset unchanged to-1 relationships of prefetched objects Key: CAY-2877 URL: https://issues.apache.org/jira/browse/CAY-2877 Project: Cayenne Issue Type: Improvement Reporter: Andrus Adamchik
Consider a chain of to-one relationships: A -> B -> C {noformat} // Run a query on B, prefetching C List<B> b = ObjectSelect.query(B.class).prefetch(B.C.joint()).select(context); assertFalse(b.get(0).readPropertyDirectly("c") instanceof Fault); // Run a query on A, prefetching B A a = ObjectSelect.query(A.class).prefetch(A.B.joint()).selectOne(context); assertFalse(b.get(0).readPropertyDirectly("c") instanceof Fault); // <-- This fails {noformat} So a somewhat independent query run in the same context can wipe out our carefully crafted prefetches in the original query, resulting in massive faulting when you go back and process b's in a loop. The original idea of blindly invalidating all relationships of a prefetched object is based on the prefetch contract - all objects in the tree must be refreshed from the DB. So we are not allowed to keep a stale relationship from B to C in the second query (e.g. it may have changed from C1 to C2 between the two queries via an external process). However, we should be smarter, and preserve at least some relationships, specifically when the fresh B snapshot has an FK that matches its previous value. So while C itself can become stale, "B.c" is still pointing to the right C ID. Of course, only works for relationships that have an FK that has all the target PK columns. -- This message was sent by Atlassian Jira (v8.20.10#820010)