Hi Simon,
The bug is the RPC Fault for the error: "Page request made for items in a lazily loaded > > property failed to retrieve the parent item". You started getting this when you set autoSyncEnabled=false. In re-reading the thread, maybe you are confusing "autoSyncEnabled" with "autoRefresh" for a given fill. The autoSyncEnabled=true turns on the logic that allows clients to be pushed changes made to any subsequent fill, getItem or createItem calls. The autoRefresh feature is an option used when autoSyncEnabled=true for a given fill method which causes FDMS to re-execute the fill after any items of that type are created or updated. If you create a new item, for example it might need to be inserted into any of the fill methods currently being autoSync'd by one or more clients. I suggested turning off autoRefresh to avoid the "repeat call to the original fill". When using the Assembler interface, you have the autoRefreshFill() method return false for the fill parameters to turn off autoRefresh. If the integrity problem still exists after you make these changes, turn on the server debug logging for the "Message.*" and "Service.*" patterns and send us the server log file. I'd expect your fill method to be called which retrieves the portfolios, each one would contain a planpoints array which has just the PlanPoint instances with only their ids populated (because lazy=true, you only return the ids). You'd see these objects returned and the "referencedIds" header in the fill result should contain the proper ids of each of the planpoints. When the client accesses the planpoints array collection, you'd see a page_items message retrieving one or more of these objects by id. These turn into getItem calls to retrieve the PlanPoint instances that get sent back to the client. In this case, the parent pointer would be a reference to a Portfolio instance which is empty except for its id (again because the parent association has lazy="true"). Jeff ________________________________ From: flexcoders@yahoogroups.com [mailto:[EMAIL PROTECTED] On Behalf Of simonjpalmer Sent: Monday, May 14, 2007 3:03 PM To: flexcoders@yahoogroups.com Subject: [flexcoders] Re: Help! Object integrity across DataService.commit() 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 <mailto:flexcoders%40yahoogroups.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:flexcoders%40yahoogroups.com> [mailto:flexcoders@yahoogroups.com <mailto:flexcoders%40yahoogroups.com> ] On > Behalf Of simonjpalmer > Sent: Monday, May 14, 2007 5:26 AM > To: flexcoders@yahoogroups.com <mailto:flexcoders%40yahoogroups.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> <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: <http://www.adobe.com/2006/flex/mx/internal:> > :dispatchFaultEvent > <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> > <mailto:flexcoders%40yahoogroups.com> , "Jeff Vroom" <jvroom@> wrote: > > > > > > Answers inline: > > > > > > > > > > > > ________________________________ > > > > > > From: flexcoders@yahoogroups.com <mailto:flexcoders%40yahoogroups.com> > <mailto:flexcoders%40yahoogroups.com> > [mailto:flexcoders@yahoogroups.com <mailto:flexcoders%40yahoogroups.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> <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> > <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 > > > > > > > > > >