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)

Reply via email to