Thanks Jeff, I was just checking out for the day when I spotted this. Exactly which part are you referring to as being a bug? Can you describe a bit more what the bug is.
I have at least two issues as far as I can tell: 1) the RPC Fault faultString error directly below and 2) the original object integrity error across the commit call, which is still a problem. Would the bug you mention be associated with one, other or both? Thanks Simon --- In flexcoders@yahoogroups.com, "Jeff Vroom" <[EMAIL PROTECTED]> wrote: > > Sorry for the delay in my response - last week was kind of crazy. > > > > Turns out this is a bug when you are using lazy loading with a filled > collection where autoSyncEnabled=false. > > > > You could workaround this problem by setting autoSyncEnabled=true. This > is also fixed in LC DS 2.5 which is coming out real soon now. > > > > Jeff > > > > ________________________________ > > From: flexcoders@yahoogroups.com [mailto:[EMAIL PROTECTED] On > Behalf Of simonjpalmer > Sent: Monday, May 14, 2007 5:26 AM > To: flexcoders@yahoogroups.com > Subject: [flexcoders] Re: Help! Object integrity across > DataService.commit() > > > > one small update, if I get everything through a single destination, > (i.e. no lazy loading and no parent-child in fds) then the problem > appears to go away. > > I may have to adopt this in the absence of any other suggestions, > however it is not really an acceptable solution because of > performance. As my graph of objects grows the performance slows down > dramatically. > > very disappointed that I can't make this work. > > --- In flexcoders@yahoogroups.com <mailto:flexcoders%40yahoogroups.com> > , "simonjpalmer" <simonjpalmer@> > wrote: > > > > Thanks for the response Jeff. > > > > I now return an object in the parent with just the id fields > populated. > > > > I have switched off autoSyncEnabled from the client end, but not in > > the destination. > > > > My destinations are as follows: > > <destination id="portfolio.spring"> > > .<adapter ref="java-dao" /> > > .<properties> > > ..<source>beanPortfolioAssembler</source> > > ..<factory>spring</factory> > > ..<metadata> > > ...<identity property="uid"/> > > ...<one-to-many property="planpoints" destination="planpoint.spring" > > lazy="true"/> > > ..</metadata> > > .</properties> > > </destination> > > > > <destination id="planpoint.spring"> > > .<adapter ref="java-dao" /> > > .<properties> > > ..<source>beanPlanPointAssembler</source> > > ..<factory>spring</factory> > > ..<metadata> > > ...<identity property="uid"/> > > ...<many-to-one property="parent" destination="portfolio.spring" > > lazy="true"/> > > ..</metadata> > > .</properties> > > </destination> > > > > so I have lazy=true set on both ends. > > > > I now get an error thrown as follows when a child object is returned > > in response to an itemPendingError: > > > > [RPC Fault faultString="Page request made for items in a lazily loaded > > property failed to retrieve the parent item. Parent destination = > > 'portfolio.spring', > > id='ASObject(11107564){uid=7BF0C662-8E35-EE93-934E-6739E64A757B}'" > > faultCode="Server.Processing" faultDetail="null"] > > at > > > mx.data::ConcreteDataService/http://www.adobe.com/2006/flex/mx/internal: > :dispatchFaultEvent > <http://www.adobe.com/2006/flex/mx/internal::dispatchFaultEvent> > ()[C:\dev\enterprise_gmc\frameworks\mx\data\ConcreteDataService.as:1602] > > at > > > ConcreteDataService.as$38::DataListRequestResponder/fault()[C:\dev\enter > prise_gmc\frameworks\mx\data\ConcreteDataService.as:4434] > > at > > > mx.rpc::AsyncRequest/fault()[C:\dev\enterprise_bali\frameworks\mx\rpc\As > yncRequest.as:107] > > at > > > NetConnectionChannel.as$40::NetConnectionMessageResponder/NetConnectionC > hannel.as$40:NetConnectionMessageResponder::statusHandler()[C:\dev\enter > prise_bali\frameworks\mx\messaging\channels\NetConnectionChannel.as:470] > > at > > > mx.messaging::MessageResponder/status()[C:\dev\enterprise_bali\framework > s\mx\messaging\MessageResponder.as:225] > > > > Does this imply I am supposed to provied a getItem() method on the > > parent destination (portfolio.spring)? > > > > If yes, what should I return? The state on the client is more recent > > than the server so it feels wrong to return an older state, plus the > > parent contains the child that is causing this to occur. > > > > What will flex do with the older parent version if I return it? > > > > Will any reconciliation of the objects occur? > > > > What do I do about the child list on the parent if I return it? > > > > Simon > > > > --- In flexcoders@yahoogroups.com > <mailto:flexcoders%40yahoogroups.com> , "Jeff Vroom" <jvroom@> wrote: > > > > > > Answers inline: > > > > > > > > > > > > ________________________________ > > > > > > From: flexcoders@yahoogroups.com > <mailto:flexcoders%40yahoogroups.com> > [mailto:flexcoders@yahoogroups.com <mailto:flexcoders%40yahoogroups.com> > ] On > > > Behalf Of simonjpalmer > > > Sent: Monday, May 07, 2007 11:34 AM > > > To: flexcoders@yahoogroups.com <mailto:flexcoders%40yahoogroups.com> > > > > Subject: [flexcoders] Re: Help! Object integrity across > > > DataService.commit() > > > > > > > > > > > > Anyone else trying to lazily load a parent-child relationship with > > > fds? The more I look at this the more I think it may be the key to > > > solving my problem. > > > > > > I have some fundamental questions: > > > 1. What *should* I return as the parent object on the child when I > > > return an object in response to an itemPendingError accessing the > > > children collection on the parent? > > > > > > [Jeff] You return an instance of the parent where only the id > properties > > > are populated (assuming that the parent reference is marked with > > > lazy="true" on the association tag which is highly recommended). > > > > > > > > > It seems crazy that I should look the parent up again and return a > > > fully populated object (the state may have changed in the client so > > > that would be wrong). If I send back a partially populated parent > > > object containing the identity I seem to get another > itemPendingError > > > when I access the parent object, which I know I already have or I > > > wouldn't have the child! So that doesn't look right either. > > > Returning null means that my child contains a null parent, which is > > > also wrong. > > > > > > 2. After a commit I seem to get a repeat call to the original fill > > > method. Why? How can I avoid this? It is not logically correct for > > > me to be passing the parent layer of the lazily loaded objects back > > > again for a second time. > > > > > > Anyone have any clues? Either I am doing something stupid (likely) > or > > > bi-directional one-to-many does not work properly (less likely, but > a > > > possibility). or maybe it works as intended but my understanding of > > > it is wrong. > > > > > > Either way, I still have a pretty serious problem traversing > backward > > > through my parent references in a graph of objects which ought to be > > > able to maintain itself. This problem remains unsolved. > > > > > > > > > > > > [Jeff] If the fill method is using the "auto refresh" > functionality, it > > > will call the fill method once for each batch of changes where you > have > > > created or updated items that might be returned by this fill. If you > > > turn off auto-refresh, it won't call the fill method again in that > > > situation. > > > > > > Jeff > > > > > > > > > > > > --- In flexcoders@yahoogroups.com > <mailto:flexcoders%40yahoogroups.com> > <mailto:flexcoders%40yahoogroups.com> > > > , "simonjpalmer" <simonjpalmer@> > > > wrote: > > > > > > > > Pete / Jeff. > > > > > > > > I think I need to start from the basics here. I have been poring > > > > through endless logs but I have some unanswered questions at the > > > > beginning which I think I need to sort out first. > > > > > > > > The basic unanswered issue for me is that when I lazily load a > child > > > > the parent reference is null. I never do anything to address this > in > > > > code (i.e. I do not populate the parent object reference). Should > I? > > > > > > > > Here is what my destinations look like (.'s for readability): > > > > > > > > <destination id="portfolio.spring"> > > > > .<adapter ref="java-dao" /> > > > > .<properties> > > > > ..<source>beanPortfolioAssembler</source> > > > > ..<factory>spring</factory> > > > > ..<metadata> > > > > ...<identity property="uid"/> > > > > ...<one-to-many property="planpoints" > destination="planpoint.spring" > > > > lazy="true"/> > > > > ..</metadata> > > > > .</properties> > > > > </destination> > > > > > > > > <destination id="planpoint.spring"> > > > > .<adapter ref="java-dao" /> > > > > .<properties> > > > > ..<source>beanPlanPointAssembler</source> > > > > ..<factory>spring</factory> > > > > ..<metadata> > > > > ...<identity property="uid"/> > > > > ...<many-to-one property="parent" destination="portfolio.spring" > > > > lazy="true"/> > > > > ..</metadata> > > > > .</properties> > > > > </destination> > > > > > > > > Notice there is a bi-directional one-to-many relationship, both > ends > > > > of which are defined as lazily loaded. My flex application has > > > > DataService object which is bound to portfolio.spring. I call the > > > > standard fill method supplying an ArrayCollection object to hold > the > > > > results and the ID of the currently connected user: > > > > > > > > [Bindable] public var activePortfolios:ArrayCollection = new > > > > ArrayCollection(); > > > > > > > > private var ds_po:DataService = new > DataService("portfolio.spring"); > > > > > > > > private function getPortfolios(authenticatedUser:User):void > > > > { > > > > ..ds_po.fill(activePortfolios, authenticatedUser.uid); > > > > } > > > > > > > > I have no client reference to planpoint.spring. On fill I populate > > > > and return a list of Portfolio objects. Each Portfolio object has > a > > > > Set called "planpoints" which I populate with PlanPoint objects > which > > > > are empty except for their uid. This means I do not send back a > > > > populated parent reference in the initial fill from > portfolio.spring. > > > > I'm not sure whether that is correct or not. Can I rely on data > > > > services to wire that up correctly or should I be sending back a > stub > > > > Portfolio object with its uid? > > > > > > > > Here is what my value objects look like. I am omitting most of the > > > > pojo code for brevity, all members are accessed by standard > getters > > > > and setters. I have an equivalent set of AS objects on the flex > side: > > > > > > > > public class Portfolio extends PojoBase implements IPojo > > > > { > > > > ... > > > > ..private String uid = new String(); > > > > ..private Set<PlanPoint> planpoints = new HashSet<PlanPoint>(); > > > > ... > > > > } > > > > > > > > public class PlanPoint extends PojoBase implements Serializable, > IPojo > > > > { > > > > ... > > > > ..private transient Portfolio parent; > > > > ..private String uid = new String(); > > > > ... > > > > } > > > > > > > > So on initial fill I have: > > > > PortfolioObject > > > > ..uid="XXX" > > > > ..planpoints > > > > ....PlanPointObject > > > > ......uid="YYY" > > > > ......parent=null > > > > ......everythingelse=null > > > > > > > > I then get server side calls through planpoint.spring when the > lazy > > > > loading of the children kicks in. The getItem calls contain the > uids > > > > of the partially populate objects that I returned on fill as > expected. > > > > I then send back fully populated PlanPoint objects EXCEPT I never > > > > populate the parent. Not surprisingly when my PlanPoint arrives on > > > > the client side it has a null parent. > > > > > > > > PlanPointObject > > > > ..uid="YYY" > > > > ..parent=null > > > > ..everythingelse=something > > > > > > > > What should I be sending back? The back reference to the parent is > > > > lazily loaded accorinding to the definition of planpoint.spring > above > > > > and the PlanPoint is being returned in response to an > itemPendingError > > > > on the client side because a stub PlanPoint is being accessed in > the > > > > context of a Portfolio. The Portfolios live in a managed > collection. > > > > Should I reply to the planpoint.spring.getItem message with a > > > > PlanPoint object containing a stub Portfolio object with its uid > > > > populated? > > > > > > > > I think that until I make sure I have this part correct it is > useless > > > > for me to look deeper into my issue. > > > > > > > > Am I doing the right thing here? > > > > > > > > As ever I really appreciate your help. This is currently standing > > > > between me and production code. > > > > > > > > Simon > > > > > > > > > >