One side of prefetching is saving us uneeded queries, when we know upfront 
which related objects we need in addition to the main query result. This is the 
angle shown in the docs where prefetching is presented as a performance 
optimization tool. 

But there is another side of it, which is just as important. It is about 
fine-grained control of refreshing parts of the object graph already in memory. 
When a query is run, Cayenne can't automatically refresh all objects directly 
or indirectly connected to the query result objects, as it would cause a 
massive fetch. With prefetching Cayenne knows how much of the object graph we 
want to refresh.

So I don't find the result all that surprising. (Although if things happen in 
the same JVM I am still surprised the relationship isn't refreshed via Cayenne 
cross-context event mechanism. This could be a race condition actually, as 
events are delivered asynchronously)

Andrus 


On Sep 16, 2011, at 10:01 PM, Christian Grobmeier wrote:

> I have not had duplication issues so far. But I will double check now.
> I added this code b/c of the problems with the null values, so it isnt
> the root cause for my problem.
> At the moment it still looks good. It seems that the prefetch helped.
> I am very puzzled about it :-)
> 
> On Fri, Sep 16, 2011 at 8:30 PM, Michael Gentry <[email protected]> wrote:
>> I seem to recall doing a setX() followed by an addToY() causes a
>> duplicate Y to be added.  I'd have to double check this, but that is
>> my recollection.
>> 
>> On Fri, Sep 16, 2011 at 2:19 PM, Andrus Adamchik <[email protected]> 
>> wrote:
>>>> but may cause duplication issues for addToY().
>>> 
>>> I hope it doesn't. But since I am trained to just set the rel in one 
>>> direction, I may not be aware of the issue.
>>> 
>>> 
>>> On Sep 16, 2011, at 9:12 PM, Mike Kienenberger wrote:
>>> 
>>>> On Fri, Sep 16, 2011 at 4:22 AM, Christian Grobmeier
>>>> <[email protected]> wrote:
>>>>> userRoles.setUser(user);
>>>>> userRoles.setRole(role);
>>>>> user.addToUserRoles(userRoles);
>>>>> role.addToRolesToJoin(userRoles);
>>>> 
>>>> Again, unless, you've specifically made both relationships
>>>> unidirectional (the default is bidirectional), you are actually
>>>> setting both sides of the relationship twice.   Not an issue for a
>>>> SetX(), but may cause duplication issues for addToY().
>>>> 
>>> 
>>> 
>> 
> 
> 
> 
> -- 
> http://www.grobmeier.de
> 

Reply via email to