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:
>
> ..verride
> 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:
>>
>> ..verride
>> 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.
>
>
This archive was generated by hypermail 2.0.0 : Sun Nov 04 2007 - 03:44:13 EST