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

Reply via email to