Similar problem, but I was not able to implement your solution - any
guidance is suggested.  And I promise, once I get my simple app
working, I will write the "GWT/Objectify 1-to-Many Relationships for
Moron Like Me" guide :).

The problem in the small...
CommitUsers can have Commitments.  I create a new Commitment and try
to associate that with the CommitUser.  But the properties on the
CommitUser (even just a string) are not persisted.  So, following:
http://code.google.com/webtoolkit/doc/latest/DevGuideRequestFactory.html#relationships
in the section on Using RequestFactory, I figure I must be falling
into the trap of not having an editable CommitUser (since I didn't
create it, the CommitUser already exists).

So I change my code from:
  Request<Void> createReq =
commitmentRequest.persist(currentCommitUserProxy).using(newCommitment);

To:
  CommitUserProxy editableCommitUserProxy =
commitUserReq.edit(currentCommitUserProxy);
  Request<Void> createReq =
commitmentRequest.persist(editableCommitUserProxy).using(newCommitment);

Where:
  commitUserReq is:
        private CommitUserRequest commitUserReq =
requestFactory.commitUserRequest();
  request Factory is:
        CommitmentSystemRequestFactory requestFactory =
GWT.create(CommitmentSystemRequestFactory.class);

This gives me the error:
Caused by: java.lang.IllegalStateException: A request is already in
progress
    at
com.google.gwt.requestfactory.client.impl.AbstractRequestContext.checkLocked(AbstractRequestContext.java:
307)

Following the advice you provided, I tried to create a new
RequestContext, so my code became...
  CommitUserRequest commitUserReq2 =
requestFactory.commitUserRequest();
  CommitUserProxy editableCommitUserProxy =
commitUserReq2.edit(currentCommitUserProxy);
  Request<Void> createReq =
commitmentRequest.persist(editableCommitUserProxy).using(newCommitment);
But that gave me the error:

Caused by: java.lang.IllegalArgumentException: Attempting to edit an
EntityProxy previously edited by another RequestContext
  at
com.google.gwt.requestfactory.client.impl.AbstractRequestContext.checkStreamsNotCrossed(AbstractRequestContext.java:
334)

Stepping back a little bit, the slightly bigger picture is that I am
following the article at:
http://www.ibm.com/developerworks/java/library/j-javadev2-13/index.html
(Java development 2.0: Twitter mining with Objectify-Appengine, Part
1).  But that article doesn't use GWT.  But the idea is that the
Commitment stores a Key<CommitUser> so that I can query the
Commitment.class to find all the Commitments whose Key matches the Key
of the current user.  When I save a Commitment, I first save the
Commitment itself and then establish the relationship by modifying the
CommitUser (as the article demonstrates).  So, my persist method
(fired above) is...

  public void persist(CommitUser commitUser) {
    // Save commitment first
    DAO dao = new DAO();
    Objectify ofy = dao.ofy();
    ofy.put(this);
    dao = null;
    // Then establish relationship
    commitUser.addCommitment(this);  // Owner is in charge
  }

And the addCommitment method on the CommitUser is:
  public  void addCommitment(Commitment commitment) {
    DAO dao = new DAO();
    Objectify ofy = dao.ofy();
    commitment.setRequesterKey(this);
    commitment.setDescription("Updated in addCommitment");
    ofy.put(this);
    dao = null;
  }

And finally, the commitment.setRequestKey() is:
  public void setRequesterKey(CommitUser commitUser) {
    this.requesterKey = new Key<CommitUser>(CommitUser.class,
commitUser.getId());
  }

In the debugger I can see that all the properties - e.g. "Description"
get set, but they are not persisted to the Datastore.

I am sure this is common, but it seems that I am very close to getting
this simple example to work - so any assistance is greatly appreciated
and I will do my best to provide assistance to the community.  I think
my qualifications as a moron have to be helpful in some way.  I am
also old if that helps :) :).

Thanks all!
RB




On Nov 9, 7:01 am, Ramon Buckland <ra...@thebuckland.com> wrote:
> Thanks Tobias,
>
> That explanation was good. I had it right logically, but omitted
> calling one of my "special - create me a new " methods, that replaced
> my RequestContext for me.
>
> All good niow. it saves data!
>
> On Nov 9, 2:28 pm, Tobias <thaberm...@gmail.com> wrote:
>
>
>
>
>
>
>
> > I *think* that happens after you have fired a RequestContext. From
> > looking at the code, which is a bit hard because of the
> > DeferredBinding that's going on there, the "locked" variable in a
> > RequestContext gets only reset to "false", if the firedRequestfails.
> > So I think you need to use a new RequestContext.
>
> > Regards,
> > Tobias
>
> > On Nov 9, 12:48 pm, Ramon Buckland <ra...@thebuckland.com> wrote:
>
> > > Hi All,
>
> > > I am currently in the process of building an app, initally based off
> > > the Roo framework.
> > > I am getting a "Arequestisalreadyinprogress" at the point where I
> > > call create for a child entity.
>
> > > Is there a way I can see what "requestcontexts" are inprogress, so I
> > > can debug where my logic is off ??
> > > Either using firebug or the eclipse debugger.
>
> > > The stack trace I get is
>
> > >Causedby:java.lang.IllegalStateException: Arequestisalreadyin
> > >progress
> > >         at
> > > com.google.gwt.requestfactory.client.impl.AbstractRequestContext.checkLocke
> > >  d(AbstractRequestContext.java:
> > > 307)
> > >         at
> > > com.google.gwt.requestfactory.client.impl.AbstractRequestContext.create(Abs
> > >  tractRequestContext.java:
> > > 76)
> > >         at
> > > isupro.client.scaffold.businessprocess.ui.AbstractBusinessProcessActivity.c
> > >  reateNewObjectiveProxy(AbstractBusinessProcessActivity.java:
> > > 92)
>
> > > My method (createNewObjectiveProxy()) usese the existingrequest,
> > > created prior so that this "new" object is in the same context.
>
> > >     public ObjectiveProxy createNewObjectiveProxy() {
> > >         ObjectiveProxy obj =
> > > getRequest().create(ObjectiveProxy.class);
> > >         obj.setId(editableBP.getId());
> > >         editableBP.getObjectives().add(obj);
> > >         return obj;
> > >     }
>
> > > Now, without looking at my code, it will be hard for anyone to assist
> > > I assume, which is why I ask " how do I go about working out where my
> > > problem is"
>
> > > regards
> > > Ramon

-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to google-web-tool...@googlegroups.com.
To unsubscribe from this group, send email to 
google-web-toolkit+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-web-toolkit?hl=en.

Reply via email to