@mscwd01 i acknowledge it is not the best solution ,but in my case i wanted a quick dirty solution and it worked. my app rarely updates hashmap so my problem is temporarily solved.if you find a better solution please post it here.
like i said before " DataNucleus has no way of "seeing" the changes you make to the internal values of a serialized field, and as a result it doesn't know when it needs to flush changes to these fields to the datastore. However, DataNucleus *can* see when the top-level serialized field reference changes." "So you need to provide "*new"* reference to the updated hashmap." On Mon, Apr 19, 2010 at 10:49 AM, hsjawanda <hsjawa...@gmail.com> wrote: > The following posting by Max Ross of the Google App Engine engineering > team is extremely useful for the case of all serialized fields (which > is the only way you can store HashMap-s in GAE (at least so far)): > > JDO/JPA Snippets That Work - Serialized Fields > http://bit.ly/9fMbPs > > > On Apr 18, 5:11 pm, mscwd01 <mscw...@gmail.com> wrote: > > Thanks for your informative reply. > > > > So basically, the only solution you found was to create a copy of the > > whole object holding the HashMap, persist the new object and delete > > the old object? > > I sincerely hope I have misunderstood you as this is a terrible way to > > have to go about it. > > > > Is there any other way, you can update a HashMap rather than creating > > a whole new object to persist? > > > > Thanks again for your help with this. > > > > On Apr 18, 6:50 am, "sreenidhi b.s" <sreenidh...@gmail.com> wrote: > > > > > > > > >http://groups.google.com/group/google-appengine-java/browse_thread/th. > .. > > > > > the link above works only for persisting and retrieving hash maps ,but > i did > > > not find any "proper" solution for updating and persisting the updated > > > hashmaps. > > > > > "You have to provide a new reference to the updated hashmap ,since > datastore > > > cannot identify between updated and stale hashmap." > > > But it did not work in my case and i urge you to try the same before > you try > > > alternatives. > > > > > The Alternative i found was , > > > 1) retrieve the persisted hashmap , > > > 2) create a new hashmap reference to updated hashmap > > > 3) make the new reference persistent. > > > 4)delete the previous reference. > > > > > code: /* i have used some custom classes ,but the you should be able to > > > understand the logic i've employed to get the solution */ > > > > > /*Retrieve the persisted HashMap*/ > > > PersistenceManager pm0= PMF.get().getPersistenceManager(); > > > Query query0 = pm0.newQuery(VocabHashMap.class); > > > List<VocabHashMap> results1 = (List<VocabHashMap>) query0.execute(); > > > /*if there are no hashmaps, create a new one */ > > > if (results1.isEmpty()) > > > { > > > > > HashMap<String, Double> map = new HashMap<String, Double>(); > > > for (String a : linelist) { > > > Double freq = map.get(a); > > > map.put(a, (freq == null) ? 1 : freq + 1); > > > } > > > VocabHashMap vhm =new VocabHashMap(map); > > > pm0.makePersistent(vhm); > > > pm0.close(); > > > > > } > > > > > else{ > > > > > for (VocabHashMap vhm : results1) { > > > > > /*if you already have a hashmap,then update it */ > > > > > HashMap<String,Double> map1=vhm.getMap(); /* assign a new reference > to > > > retrieved hashmap */ > > > > > for (String a : linelist) { > > > Double freq = map1.get(a); > > > map1.put(a, (freq == null) ? 1 : freq + 1); > > > > > } > > > > > VocabHashMap vhm1=new VocabHashMap(map1); /* create a new > hashmap*/ > > > pm0.makePersistent(vhm1); /*save the updated one */ > > > pm0.deletePersistent(vhm); /*delete the old reference */ > > > > > } > > > > > pm0.close(); > > > > > } > > > On Sun, Apr 18, 2010 at 10:41 AM, seleronm <seler...@gmail.com> wrote: > > > > Hi, > > > > > > I was useful referring to this thread. > > > > You might be also useful for it. > > > > > > > http://groups.google.com/group/google-appengine-java/browse_thread/th... > > > > > > Hope some of this helps. > > > > > > thanks. > > > > > > > I am not able to persist a HashMap field. This is how I define it: > > > > > > > @Persistent(serialized = "true", defaultFetchGroup = "true") > > > > > private Map<String, Integer> items; > > > > > > > When I create the Object which the Map is a field of, I instantiate > > > > > the Map as follows: > > > > > > > items = new HashMap<String, Integer>(); > > > > > > > When I update the "items" HashMap I try to persist the object by > doing > > > > > the following: > > > > > > > PersistenceManager pm = PMF.get().getPersistenceManager(); > > > > > // Query for Object (HashMap is a field of this Object) > > > > > // Update HashMap > > > > > pm.makePersistent(objectContainingHashMap); > > > > > > > However, when I attempt to retrieve the object after persisting it > and > > > > > read the HashMap it is always empty, as though I never updated it. > > > > > > > Has anyone experienced this before? > > > > > > > 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 > google-appengine-j...@googlegroups.com. > To unsubscribe from this group, send email to > google-appengine-java+unsubscr...@googlegroups.com<google-appengine-java%2bunsubscr...@googlegroups.com> > . > For more options, visit this group at > http://groups.google.com/group/google-appengine-java?hl=en. > > -- 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 google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.