Re: Object migrates between DataDomains

From: emre.yilma..tr.com.tr
Date: Thu Apr 13 2006 - 06:37:24 EDT

  • Next message: Andrus Adamchik: "Re: Object migrates between DataDomains"

    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