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? 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. Simon --- In flexcoders@yahoogroups.com, "simonjpalmer" <[EMAIL PROTECTED]> 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 >