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().
org.objectstyle.cayenne.access.ObjectStoreGraphDif..e97cd
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: cayenne-use..ncubator.apache.org
>
> On Apr 12, 2006, at 12:33 PM, emre.yilma..tr.com.tr 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
>
>
This archive was generated by hypermail 2.0.0 : Thu Apr 13 2006 - 06:37:21 EDT