Re: different ObjectContext...

From: Arnaud Garcia (arnau..magemed-87.com)
Date: Wed Apr 28 2010 - 03:58:37 EDT

  • Next message: Julius Spencer: "Re: Hollow object after fetch and move to new DataContext"

    thanks I will try !

    arnaud

    2010/4/27 Marcin Skladaniec <poldwusmoko..mail.com>

    > Hi
    > I'm not sure about the environment you are using, but there is an easier
    > way. Lookup localObject(ObjectId id, Object prototype) in CayenneContext
    > class.
    > most of the time all you need to do is:
    >
    > PersistentObject copiedPO = context.localObject(originalPO.getObjectId(),
    > null);
    >
    > Marcin
    >
    >
    > On 24/04/2010, at 9:54 PM, Nishant Neeraj wrote:
    >
    > > Hi Arnaud,
    > >
    > > Sorry, did not see this post earlier.
    > > We stumbled on this problem, especially when playing with browser back
    > > button.
    > > I am not sure if de-serialization causes re-bind of the Context to
    > different
    > > thread... specially when we have session level DataContext that stays
    > alive
    > > across the pages.
    > >
    > > Anyways, I did a work around for this. I wrote a LoadableDetachable type
    > of
    > > IModel that performs
    > >
    > > [CODE]
    > > public T getObject() {
    > > if (this.object == null) {
    > > if (this.objectId != null) {
    > > this.object = load(objectId);
    > > if (this.object == null) {
    > > throw new MyRuntimeException("Entity not found. Id: "
    > > + this.objectId);
    > > }
    > > }
    > > }
    > >
    > > if (this.object != null
    > > && ((DataObject) object).getPersistenceState() ==
    > > PersistenceState.HOLLOW
    > > && this.objectId != null) {
    > > this.object = load(this.objectId);
    > > }
    > >
    > > return this.object;
    > > }
    > >
    > > [/CODE]
    > >
    > >
    > > And load is something like this
    > >
    > > [CODE]
    > > private T load(ObjectId objId) {
    > > DataContext ctx = ((CayenneORMInterface) EduShareSession.get()
    > > .getSessionORMInterface()).getDataContext();
    > > DataObject dobj = (DataObject) DataObjectUtils.objectForPK(ctx,
    > > objId);
    > > return (T) dobj;
    > > }
    > > [/CODE]
    > >
    > > This works most of the cases.
    > >
    > > However, I am still looking for a better solution because if you perform
    > > DataContext.newObject(...) -- the object, when serialized without
    > > DataContext.commitChanges() -- does not hold a permanentId (temporary
    > object
    > > ID is not much help). And you can't ask Cayenne to resurrect this from
    > Cache
    > > based on temporaryId.
    > >
    > >
    > > Hopefully this helps. Suggestions welcome.
    > >
    > > - Nishant
    > >
    > > On Fri, Apr 23, 2010 at 12:43 AM, Arnaud Garcia <arnau..magemed-87.com
    > >wrote:
    > >
    > >> Hello,
    > >> (lot of questions today ;-)
    > >>
    > >> I have a curious error on my site (wicket+cayenne).
    > >>
    > >> Cannot set object as destination of relationship toAdresse because it is
    > in
    > >> a different ObjectContext
    > >> at
    > >>
    > >>
    > org.apache.cayenne.CayenneDataObject.willConnect(CayenneDataObject.java:344)
    > >> at
    > >>
    > >>
    > org.apache.cayenne.CayenneDataObject.setToOneTarget(CayenneDataObject.java:298)
    > >>
    > >>
    > >>
    > >> How a cayenne object can be in a different context ? (In my
    > understanding a
    > >> Context is attached to the current thread, so different ObjectContext
    > means
    > >> different threads)
    > >>
    > >> Is it possible that the Wicket serialize/de-serialize mechanism create
    > a
    > >> new re-bind of the Context to another thread ??
    > >> there was a similar discussion 2 weeks ago:
    > >>
    > >>
    > http://cayenne.195.n3.nabble.com/Conditions-when-PersistenceState-gets-hollow-tp691334p692371.html
    > >>
    > >>
    > >> thanks
    > >>
    > >> Arnaud
    > >>
    >
    >



    This archive was generated by hypermail 2.0.0 : Wed Apr 28 2010 - 03:59:35 EDT