Frederik, many thanks. I posted this issue to Datanucleus Appengine group(http:// code.google.com/p/datanucleus-appengine/issues/detail?id=219). But nobody has answered to it. :((( If I start to change my object model I will have some problem: we already have production server with one-2-many relationships :( Transaction is good idea, but this not work too. I tested this... Therefore I need any other solutions.
On 14 авг, 16:31, Frederik Pfisterer <[email protected]> wrote: > Hi Aleksey, > > There are a few things you can try including using > transactionshttp://code.google.com/intl/de-DE/appengine/docs/java/datastore/trans... > . > But from personal experience I have to warn you to be careful with one- > to-many in JDO and recommend you don't use these relationships right > now, as you might eventually run into very strange behaviour, e.g. if > you ever have to remove children. Refer to these issues if you should > experience any strange > behaviour:http://code.google.com/p/datanucleus-appengine/issues/list > . > > As an alternative store the child entities in the entity group of the > parent explicitly by using setParentKey and a field like > @Persistent > @Extension(vendorName="datanucleus", key="gae.parent-pk", > value="true") > private Key parentKey; > > You can then find all children with a query on the child type and > parent key and manage this kind of relationship yourself. > > Hope this helps :-) > > On 13 Aug., 14:01, Aleksey Kiselev <[email protected]> wrote: > > > Hi, group!!! > > > Sometimes my GAE application can't persist collection of child > > elements. > > I have following objects structure. > > @PersistenceCapable(table = "persons", identityType = > > IdentityType.APPLICATION) > > public class PersonEntity { > > @PrimaryKey > > @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > > private Long id; > > > @Persistent > > private String name; > > > @Persistent > > private List<OfferEntity> offers = new ArrayList<OfferEntity>(); > > > // ... getter and setter > > > } > > > @PersistenceCapable(table = "offers", identityType = > > IdentityType.APPLICATION) > > public class OfferEntity { > > @PrimaryKey > > @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > > private Key id; > > > @Persistent > > private List<ChoosedElementEntity> choosedElements = new > > ArrayList<ChoosedElementEntity>(); > > > // ... getter and setter > > > } > > > @PersistenceCapable(table = "offer_selections_ce", identityType = > > IdentityType.APPLICATION) > > public class ChoosedElementEntity { > > @PrimaryKey > > @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > > private com.google.appengine.api.datastore.Key id; > > > @Persistent > > private String filed; > > > // ... getter and setter > > > } > > > First of all I try to persist object of class PersonEntity. It is all > > right. > > PersistenceManager = null; > > try { > > pm = getPersistenceManager(); > > PersonEntity person = new PersonEntity(); > > // set person fields > > pm.makePersistent(person);} catch (Throwable th) { > > } finally { > > > if (null != pm) { > > pm.close(); > > } > > > } > > > Then, I try to add some child elements to OfferEntity. And I am > > thoroughly confused: Sometimes child object persists and sometimes > > not. This behavior is very strange. > > String offerId = ...; > > PersistenceManager pm = null; > > try { > > pm = getPersistenceManager(); > > OfferEntity dbOffer = pm.getObjectById(OfferEntity.class, > > KeyFactory.stringToKey(offerId)); > > if (null != dbOffer) { > > ChoosedElementEntity element = new ChoosedElementEntity(); > > // set element fields > > dbOffer.getChoosedElements().add(element); > > log.log(Level.INFO, "try to commit 'added choosed elements': > > offerId=" + dbOffer.getId() + ", size: " + > > dbOffer.getChoosedElements().size() + ", elements: " + > > dbOffer.getChoosedElements()); > > pm.makePersistent(dbOffer); > > }} catch (Throwable th) { > > > log.log(Level.SEVERE, "Can't add choosed elements to offer entity: > > offerId=" + offerId, th); > > throw new ServiceException("Can't add choosed elements to offer > > entity: offerId=" + offerId, th);} finally { > > > if (null != pm) { > > pm.close(); > > } > > > } > > > I try to analyze some child information before persist parent object > > and I note, that from time to time child element has/hasn't value for > > primary key. > > Example: > > "try to commit 'added choosed elements': offerId=persons(1092001)/ > > offers(1), size: 1, elements: > > [ChoosedElementEntity{id=persons(1092001)/offers(1)/ > > offer_selections_ce(5001), filed='filed765'}]" > > or > > "try to commit 'added choosed elements': offerId=persons(1092001)/ > > offers(1), size: 1, elements: [ChoosedElementEntity{id=null, > > filed='filed766'}]" > > > Any help would be greatly appreciated. Thanks. > > -- 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.
