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"
<[EMAIL PROTECTED]>
To: <[email protected]>
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.