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 <[email protected]>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
>

Reply via email to