cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andrus Adamchik <and...@objectstyle.org>
Subject Re: 2.0.4: child DataContext & localObject
Date Sun, 04 Nov 2007 10:39:42 GMT
Could be a bug then. Yes, 'localObject' should do the right thing for  
committed objects.

Andrus


On Nov 4, 2007, at 12:23 PM, Marc A. Donis wrote:

> Hi, thanks for the reply.
>
> The ref object is committed.  In fact, it is read-only.
>
> btw, I found a solution, which I do not like much:
>
> @Override
> public void setToOneTarget(String relationshipName, DataObject  
> value, boolean setReverse) {
>    if (value != null && value.getDataContext() !=  
> this.getDataContext()) {
>       DataContext dc = getDataContext();
>       value = dc.refetchObject(value.getObjectId());
>    }
>    super.setToOneTarget(relationshipName, value, setReverse);
> }
>
> Clearly, this results in an unnecessary fetch to bring the  
> reference object into the master object's DataContext.  I'd still  
> very much like to understand why simply doing "value = (DataObject)  
> dc.localObject(value.getObjectId(), null);" causes the relationship  
> to be reset to null by DataContext.onContextFlush().  Is this a bug?
>
> Regards,
> Marc
>
> ----- Original Message ----- From: "Andrus Adamchik"  
> <andrus@objectstyle.org>
> To: <user@cayenne.apache.org>
> Sent: Sunday, November 04, 2007 09:43
> Subject: Re: 2.0.4: child DataContext & localObject
>
>
>> 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.
>>>
>>>
>>
>
>


Mime
View raw message