Hi Tad,

yeah, overlapping relationships (multiple relationships over the same db-path) 
are not automatically synchronized on a local change. I.e. Cayenne thinks "Slot 
-> Shift -> Schedule" and "Slot -> Schedule" are two unrelated things. So this 
is a "feature". 

I've thought about it a few times in the past, and it should be possible to 
close this hole. But for now your approach of refetching a given relationship 
is one way to solve it. I am personally trying to avoid overlapping 
relationships in my models.

Andrus 


On Jun 25, 2012, at 8:50 PM, Tad wrote:
> Hi all,
> 
> I have a setup with a relationship like the following:
> 
> Slot (to one) Shift (to one) Schedule
> 
> In the Modeler, I created a flattened relationship between Slot and
> Schedule by traversing the Shift relationship:
> 
> <obj-relationship name="schedule" source="Slot" target="Schedule"
> db-relationship-path="shift.schedule"/>
> 
> In most cases, this works fine. Calling Slot.getSchedule() resolves a
> ToOneFault that returns the Schedule object.
> 
> The problem I'm having is right after creating a Slot object, assigning it
> to a new Shift object via Shift.addToSlots(Slot), then committing the
> change. Calling Slot.getSchedule() ends up in
> readPropertyDirectly("schedule"), which returns null because the ToOneFault
> has not been populated.
> 
> After re-querying the Slot, the Schedule field is populated correctly with
> a ToOneFault. It is only directly after the Slot/Shift objects are created
> and the ObjectContext has committed that this field is missing.
> 
> Does this appear to be an error in my setup or procedure, an undocumented
> quirk of flattened relationships, or a bug in Cayenne?
> 
> Thanks for any help you can give.
> 
> -Tad

Reply via email to