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 > >
