Think I found the solution, thanks to this:
http://groups.google.com/group/google-appengine-java/browse_thread/thread/fb12ab60c68bf664/4179ae7a25931a53?lnk=gst&q=usersTemp#4179ae7a25931a53
Now I'm updating the counter using that method and everything is
working as expected...
public void updateQueryCounter(String query )
{
Integer counter = queries.get( query );
if( counter == null )
counter = new Integer( 1 );
else
counter = new Integer( counter.intValue() + 1 );
queries.put(query, counter);
queriesTemp=queries;
queries=null;
queries=queriesTemp;
}
Thanks again!
On Nov 1, 3:22 am, Rusty Wright <[email protected]> wrote:
> Whoops, sorry; ignore my remark about UserStats not being persistable; I
> looked again at your code and saw that it has a key. I was confused and
> thinking that you're persisting the List, not an item in the List. But I
> think the problem with it becoming a root object still remains.
>
>
>
> Rusty Wright wrote:
> > 1) In the case of result.isEmpty(), I don't see where you're adding the
> > new UserStats to the result list.
>
> > 2) When you do pm.makePersistent( stats ) I think you're going to have a
> > problem adding the new stats to the List<UserStats>, because that
> > makePersistent is going make a new stats a root/parent object. But then
> > I don't see how you can do a makePersistent on stats since it doesn't
> > have a Key field; I thought you can/should only call makePersistent on
> > objects that have a primary key field (your classes, annotated with
> > @PersistenceCapable).
>
> > 3) Constructing queries with string concatenation like that is a
> > security hole, an invitation to sql injection attacks. Use parameters.
> >http://xrl.in/3i9x
>
> > 4) I'm wondering if you're approaching this thinking about things the
> > "old" relational database way, with tables. Instead, map out your
> > domain objects as java objects, and don't think about tables at all.
> > Wipe sql tables from your mind when using Google App Engine. Use pencil
> > and paper and draw diagrams showing what's inside of what or what needs
> > what (for example, uml diagrams). Whenever you have an object that's
> > not inside another object stop and analyze things and see if there is
> > some way it could/should go inside another object; this can be hard at
> > first if you're still thinking about tables and joins (I'm still
> > figuring this out). At the moment my thinking is that the only time you
> > should have an object not be inside another object, *when you persist
> > it* (whereupon it becomes a root object), is an object that moves
> > around; sometimes it's in object A, sometimes object B, etc. Then you
> > have to store in the containing outer object the inner object's Key
> > instead of th
> > e object. For example, in your case, I'm wondering if instead of having
> > a List of UserStats, have a List of User, and each user has a UserStats
> > object in it.
>
> > I'm still trying to figure this out so I could be wrong about this.
>
> > barak wrote:
> >> Here it is:
>
> >> PersistenceManager pm = PMF.get().getPersistenceManager();
>
> >> List<UserStats> result = (List<UserStats>) pm.newQuery( "select from "
> >> + UserStats.class.getName() + " where id == '" + session.getId() +
> >> "'" ).execute();
>
> >> if( result.isEmpty() )
> >> stats = new UserStats( session.getId(), System.currentTimeMillis
> >> () );
> >> else
> >> stats = result.get( 0 );
>
> >> Integer counter = stats.getQueries().get( query );
>
> >> if( counter == null )
> >> counter = new Integer( 1 );
> >> else
> >> counter = new Integer( counter.intValue() + 1 );
>
> >> stats.getQueries().put( query, counter );
>
> >> try
> >> {
> >> pm.makePersistent( stats );
> >> }
> >> finally
> >> {
> >> pm.close();
> >> }
>
> >> On Oct 30, 8:47 pm, "Jason (Google)" <[email protected]> wrote:
> >>> Can you post the code that you're using to re-persist the updated
> >>> HashMap?
>
> >>> - Jason
>
> >>> On Thu, Oct 29, 2009 at 6:07 AM, barak <[email protected]> wrote:
>
> >>>> Thanks, did that and the map is indeed serialized now. But now, the
> >>>> enitity is fetched, seems like the state is not always kept.
> >>>> For example, I would like to store some attribute from an HttpSession
> >>>> using the UserStats instance. Every time a user in a session press
> >>>> some button, a instance is fetched (using the session id as an
> >>>> identifier) and update a counter in the HashMap. The problem I faced
> >>>> is even that the object is found by the JDO, the counter updated and
> >>>> the object persisted again, next fetch does not return the instance
> >>>> with the updated counter. Can you help please debugging this?
> >>>> This is the data object:
> >>>> @PersistenceCapable(identityType = IdentityType.APPLICATION)
> >>>> public class UserStats
> >>>> {
> >>>> �...@primarykey
> >>>> �...@persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
> >>>> private
> >>>> Key key;
> >>>> �...@persistent
> >>>> private String id;
> >>>> �...@persistent
> >>>> private Long time;
> >>>> �...@persistent( serialized ="true" )
> >>>> private HashMap<String, Integer> queries;
> >>>> public UserStats( String id, Long time )
> >>>> {
> >>>> this.id = id;
> >>>> this.time = time;
> >>>> queries = new HashMap<String, Integer>();
> >>>> }
> >>>> public Key getKey()
> >>>> {
> >>>> return key;
> >>>> }
> >>>> public String getId()
> >>>> {
> >>>> return id;
> >>>> }
> >>>> public void setId( String id )
> >>>> {
> >>>> this.id = id;
> >>>> }
> >>>> public Long getTime()
> >>>> {
> >>>> return time;
> >>>> }
> >>>> public void setTime( Long time )
> >>>> {
> >>>> this.time = time;
> >>>> }
> >>>> public HashMap<String, Integer> getQueries()
> >>>> {
> >>>> return queries;
> >>>> }
> >>>> public void setQueries( HashMap<String, Integer> queries )
> >>>> {
> >>>> this.queries = queries;
> >>>> }
> >>>> }
> >>>> On Oct 29, 10:38 am, Patrizio Munzi <[email protected]> wrote:
> >>>>> HashMap isn't supported as a persistable type.
> >>>>> The only way you've got to persist it is serialize it:
> >>>>http://gae-java-persistence.blogspot.com/2009/10/serialized-fields.html
> >>>>> 1KViewDownload- Hide quoted text -
> >>> - Show quoted text -- Hide quoted text -
>
> - Show quoted text -
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---