Polymorphism is broken and the issue to fix it has more stars than any other persistence issue. You can see the list here: http://code.google.com/p/datanucleus-appengine/issues/list?can=2&q=&sort=-stars&colspec=ID%20Stars%20Type%20Status%20Priority%20FoundIn%20TargetRelease%20Owner%20Summary
I'm working on getting this fixed for the next SDK release. On Mon, Oct 26, 2009 at 6:33 AM, Patrizio Munzi <[email protected]>wrote: > Hey guys, > > no feedback on this?? > > BR > Patrizio > > > Patrizio Munzi wrote: > > Hi Jason and Max, > > I was making some tests on this today and I've found out that one-to-many > relationship child objects retrieving works as long as the one-to-many > relationship doesn't involve polymorphisms. > For example, if we make the Child class abstract and save subclasses into > the list the retrieving fails. > > In the following the snippet that fails. > Is this a bug? > Am I doing something wrong?? > > Thanks > > ----------------------- > String parentId = "test"; > PersistenceManager pm = PMF.get().getPersistenceManager(); > pm.currentTransaction().begin(); > Parent parent = new Parent(); > Child subChild = new SubChild(); > subChild.setParentId(parentId); > parent.getChilds().add(subChild); > pm.makePersistent(parent); > pm.currentTransaction().commit(); > pm.close(); > > pm = PMF.get().getPersistenceManager(); > parent = pm.getObjectById(Parent.class, parentId); > assertEquals(1, parent.getModules().size()); > pm.close(); > ----------------------- > ----------------------- > public abstract class Child implements Serializable { > > private static final long serialVersionUID = -5125563546796512541L; > > @PrimaryKey > @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > @Extension(vendorName="datanucleus", key="gae.encoded-pk", > value="true") > protected String encodedKey; > > @Persistent > @Extension(vendorName="datanucleus", key="gae.pk-name", value="true") > protected String parentId; > > [...] > } > > @PersistenceCapable(identityType = IdentityType.APPLICATION, > detachable="true") > public class SubChild extends Child { > > private static final long serialVersionUID = 521265701642620882L; > > @Persistent(defaultFetchGroup="true") > private String name; > > } > ---------------------- > > Jason (Google) wrote: > > Max is right, although there's a small issue with the syntax: > > @Persistent(mappedBy="parent", defaultFetchGroup = "true") > public List<Child> childs; > > - Jason > > On Mon, Oct 19, 2009 at 10:26 PM, Max Zhu <[email protected]> wrote: > >> Hi Lars, >> >> Try to annotate your relationship as follows: >> >> @Persistent(mappedBy="parent", default-fetch-group="true") >> public List<Child> childs; >> >> >> On Tue, Oct 20, 2009 at 12:19 AM, Lars <[email protected]> wrote: >> >>> >>> Hi, >>> I am failing to retrieve child-objects in a one-to-many JDO relation >>> in the datastore. The case is as follows; >>> >>> I have two classes (Parent & Child, code-snippet below) with a defined >>> one-to-many relation. >>> It is no problem storing the structure with the 'store'-operation >>> defined below. This is easily verified by web-browsing the datastore. >>> >>> However, when retrievning the parent-object from the datastore >>> ('fetchParents'), the ''childs' attribute is always null. What must be >>> done to (auto-)populate this attribute from the datastore? >>> Also, the 'parent'-attribute of the Child-objects will also be null if >>> they are fetched in a similar way. >>> >>> All clues appreciated... >>> >>> Lars >>> >>> - - - - - - - Code samples below - - - - - - >>> >>> @PersistenceCapable(identityType = IdentityType.APPLICATION) >>> public class ParentDTO { >>> @PrimaryKey >>> @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) >>> @Extension(vendorName="datanucleus", key="gae.encoded-pk", >>> value="true") >>> private String encodedKey; >>> >>> @Persistent >>> public String name; >>> >>> @Persistent(mappedBy="parent") >>> public List<Child> childs; >>> >>> public ParentDTO() >>> { >>> >>> } >>> >>> public void add(Child c) >>> { >>> if (childs == null) >>> childs = new ArrayList<Child>(); >>> kids.add(c); >>> } >>> } >>> >>> - - - - >>> >>> @PersistenceCapable(identityType = IdentityType.APPLICATION) >>> public class Child { >>> @PrimaryKey >>> @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) >>> @Extension(vendorName="datanucleus", key="gae.encoded-pk", >>> value="true") >>> public String encodedKey; >>> @Persistent >>> public String name; >>> >>> @Persistent >>> public Parent parent; >>> >>> public Child() >>> { >>> } >>> >>> public String getEncodedKey() { >>> return encodedKey; >>> } >>> } >>> >>> - - - - - >>> >>> Storing to datastore (works perfectly) >>> >>> public void store() >>> { >>> Parent p = new Parent(); >>> p.navn = "nils"; >>> >>> Child c = new Child(); >>> c.name = "jim"; >>> p.add(c); >>> >>> c = new ChildDTO(); >>> c.name = "anne"; >>> p.add(c); >>> >>> PersistenceManager pm = >>> PMF.get().getPersistenceManager(); >>> try { >>> pm.makePersistent(p); >>> } catch (Exception ee) { >>> res = ee.getMessage(); >>> } finally { >>> pm.close(); >>> } >>> } >>> >>> - - - - - - Fetching data (not working) >>> >>> public String fetchParents() >>> { >>> String res = ""; >>> PersistenceManager pm = >>> PMF.get().getPersistenceManager(); >>> >>> javax.jdo.Query query = pm.newQuery(Parent.class); >>> List<Parent> parents = (List<Parent>) query.execute(); >>> Iterator<Parent> iterF = parents.iterator(); >>> while (iterF.hasNext()) { >>> Parent f = iterF.next(); >>> res = res + ":" + f.name; >>> if (f.childs != null) { // this is the >>> problem - 'this.childs' is >>> always null >>> Iterator<Child> iterI = >>> f.childs.iterator(); >>> while (iterI.hasNext()) { >>> Child idto = iterI.next(); >>> res = res + ">" + >>> idto.name; >>> } >>> } >>> } >>> pm.close(); >>> } >>> >>> >>> >> >> >> > > > > -- > > *Patrizio Munzi* > Product Specialist > Viale Bruno Buozzi, 19 - 00197 Roma (Italy) > tel: +39 06 4543 3540 > fax: +39 06 4543 3587 > mobile: +39 393 7195 164 > mail: [email protected] > web: http://www.eris4.com > skype: eris4_munzi > > > > -- > > *Patrizio Munzi* > Product Specialist > Viale Bruno Buozzi, 19 - 00197 Roma (Italy) > tel: +39 06 4543 3540 > fax: +39 06 4543 3587 > mobile: +39 393 7195 164 > mail: [email protected] > web: http://www.eris4.com > skype: eris4_munzi > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Google App Engine for Java" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~----------~----~----~----~------~----~------~--~---
<<image/gif>>
<<inline: logo.gif>>
