Hi,
I have some problems. I download the cayenne-1.2-dev-2006-4-12.tar as you said. I use the your definitions but targetContext.onSync throws below exception when localContext.commitChanges().
[email protected]org.objectstyle.cayenne.property.PropertyAccessException: [v.1.2-dev-2006-4-12 April 12 2006] Error reading DataObject property: name
at org.objectstyle.cayenne.property.DataObjectAccessor.readPropertyDirectly(DataObjectAccessor.java:98)
at org.objectstyle.cayenne.property.SimpleProperty.readPropertyDirectly(SimpleProperty.java:110)
at org.objectstyle.cayenne.property.SimpleProperty.readProperty(SimpleProperty.java:81)
at org.objectstyle.cayenne.access.ObjectDiff$4.visitProperty(ObjectDiff.java:210)
at org.objectstyle.cayenne.property.SimpleProperty.visit(SimpleProperty.java:94)
at org.objectstyle.cayenne.property.BaseClassDescriptor.visitProperties(BaseClassDescriptor.java:247)
at org.objectstyle.cayenne.access.ObjectDiff.applySimplePropertyChanges(ObjectDiff.java:206)
at org.objectstyle.cayenne.access.ObjectDiff.access$100(ObjectDiff.java:28)
at org.objectstyle.cayenne.access.ObjectDiff$2.apply(ObjectDiff.java:105)
at org.objectstyle.cayenne.graph.CompoundDiff.apply(CompoundDiff.java:133)
at org.objectstyle.cayenne.access.ObjectStoreGraphDiff.apply(ObjectStoreGraphDiff.java:151)
at org.objectstyle.cayenne.access.DataContext.onContextFlush(DataContext.java:1171)
at org.objectstyle.cayenne.access.DataContext.onSync(DataContext.java:1148)
at tr.com.htr.hgys.db.base.DataListener.graphFlushed(DataListener.java:66)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.objectstyle.cayenne.util.Invocation.fire(Invocation.java:240)
at org.objectstyle.cayenne.event.EventManager$Dispatch.fire(EventManager.java:433)
at org.objectstyle.cayenne.event.DispatchQueue.dispatchEvent(DispatchQueue.java:182)
at org.objectstyle.cayenne.event.DispatchQueue.dispatchEvent(DispatchQueue.java:94)
at org.objectstyle.cayenne.event.EventManager.dispatchEvent(EventManager.java:372)
at org.objectstyle.cayenne.event.EventManager.postEvent(EventManager.java:343)
at org.objectstyle.cayenne.access.DataContext.fireDataChannelCommitted(DataContext.java:1616)
at org.objectstyle.cayenne.access.DataContext.flushToParent(DataContext.java:1225)
at org.objectstyle.cayenne.access.DataContext.commitChanges(DataContext.java:1121)
at tr.com.htr.hgys.db.base.DbObject.commitChanges(DbObject.java:246)
at tr.com.htr.hgys.db.Title.setTitle(Title.java:101)
----- Orjinal Mesaj -----
Kimden: Andrus Adamchik
Tarih: Wednesday, April 12, 2006 13:23
Konu: Re: Object migrates between DataDomains
Kime:
[email protected]On Apr 12, 2006, at 12:33 PM, [email protected] wrote:For update:???
ClassDescriptor descriptor =
localContext.getEntityResolver().getClassDescriptor(obj.getClass
().getSimpleName());
System.err.println(new
DeepMergeOperation(ctx).merge(obj,
descriptor));
ctx.commitChanges();
Ok, so you have something akin to a replication mechanism. Let's
try
putting the new 1.2 DataChannel API to work. This is an
unforeseen
use of such API, but looks like it might work and actually allow
you
to synchronize all changes of the entire context at once
(instead of
object by object). I have no time right now to test a fully
working
example (and the API is new so there is no docs yet), but let
me
outline the possible approach.
* Get the latest Cayenne nightly build (it fixes some
DataChannel
event bugs).
* On commit DataContext (which is itself a DataChannel)
broadcasts
two GraphEvents - one that contains committed context changes
and
another one with generated PK (all changes are represented
as
GraphDiff instances). See 'DataContext.flushToParent(..)' for
details
on how the events are sent.
* You can register your own listener for the *source*
DataContext
(look at DataContext.setChannel(..) on how to register a
listener)
and apply the first group of changes to the *target* DataContext
via
DataContext.onSync(..):
GraphEvent e;
// first type of event
if(e.getSource() == sourceContext && e.getPostedBy() ==
sourceContext) {
targetContext.onSync(sourceContext,
e.getDiff(),
DataChannel.FLUSH_NOCASCADE_SYNC);
}
* Applying PK changes is less trivial, as onSync won't
work...
Probably you'll have to repost this event on behalf of
targetContext's channel so that target context catches it and
updates
itself accordingly.
// second type of event with PKs
else if(e.getSource() == sourceContext && e.getPostedBy()
==
sourceContext.getChannel()) {
???
}
Andrus