Hi Marc,

is the target object ('ref') committed, or is it in some other state (new, modified, etc.)?

Andrus

On Nov 3, 2007, at 12:36 PM, mad7777 wrote:
Just to follow up... I've tried doing:

        @Override
        public void setToOneTarget(String relationshipName, DataObject value,
boolean setReverse) {
if (value != null && value.getDataContext() != this.getDataContext () &&
value.getDataContext() != this.getDataContext()) {
                        DataContext dc = getDataContext();
                        value = (DataObject) 
dc.localObject(value.getObjectId(), value);
                        value.setPersistenceState(PersistenceState.COMMITTED);
                }
                super.setToOneTarget(relationshipName, value, setReverse);
        }

... but alas, the result is the same as below.

I admit I don't understand what is going on here. It seems that I can't use a shared DataContext in conjunction with a nested (i.e. child) DataContext?
Is this a bug, or am I just going about this all wrong??

Marc



mad7777 wrote:

Hi,

I am seeing a strange interaction between child DataContexts and
localObject. If I set a to-one relationship from an object residing in a child context to another object which lives in that context's parent, I
see:

org.apache.cayenne.CayenneRuntimeException: [v.2.0.4 October 12 2007]
Cannot
set object as destination of relationship abuseStatus because it is in a
different DataContext

So I do:

 @Override
public void setToOneTarget(String relationshipName, DataObject value,
boolean setReverse) {
if (value != null && value.getDataContext() != this.getDataContext() &&
value.getDataContext() != this.getDataContext()) {
   DataContext dc = getDataContext();
   value = (DataObject) dc.localObject(value.getObjectId(), null);
  }
  super.setToOneTarget(relationshipName, value, setReverse);
 }

in the child context object's class, which works fine (but seems like it
should not be necessary?).

But what I really want is:

  DataContext refDataContext = DataContext.createDataContext();
  CayenneDataObject ref = ...// get reference from refDataContext
  DataContext userDataContext =
DataContext.createDataContext().createChildDataContext();
  CayenneDataObject obj =
userDataContext.createAndRegisterNewObject(MasterObject.class);
  obj.setRef(ref);

In other words, the obj's context (the child context) is not a child of
the
referenced object's context.
In combination with the first bit of code, I now get:

org.apache.cayenne.validation.ValidationException: [v.2.0.4 October 12
2007] Validation has failed.
Validation failure for MasterObject.ref: "ref"  is required.

because all the to-one relationship values set in this way are reset to
null
during userDataContext.commitChanges()!

The stack looks like this:

MasterObject.setToOneTarget(UnAmourDataObject.java:11) *** value ==
null
in this call
org.apache.cayenne.access.ChildDiffLoader.arcCreated (ChildDiffLoader.java:120) org.apache.cayenne.access.ObjectDiff$ArcOperation.apply (ObjectDiff.java:428)
org.apache.cayenne.graph.CompoundDiff.apply(CompoundDiff.java:97)
org.apache.cayenne.access.ObjectStoreGraphDiff.apply (ObjectStoreGraphDiff.java:136) org.apache.cayenne.access.DataContext.onContextFlush (DataContext.java:1188)
org.apache.cayenne.access.DataContext.onSync(DataContext.java:1167)
org.apache.cayenne.access.DataContext.flushToParent (DataContext.java:1234) org.apache.cayenne.access.DataContext.commitChanges (DataContext.java:1138)

Thoughts? Comments? Suggestions?

Thanks,
Marc




--
View this message in context: http://www.nabble.com/2.0.4%3A-child- DataContext---localObject-tf4734281.html#a13561667
Sent from the Cayenne - User mailing list archive at Nabble.com.



Reply via email to