Re: Object migrates between DataDomains

From: Andrus Adamchik (andru..bjectstyle.org)
Date: Thu Apr 13 2006 - 07:04:33 EDT

  • Next message: emre.yilma..tr.com.tr: "Re: Object migrates between DataDomains"

    At this point to be able to help you I'd have to actually write a
    test app that does what you are doing, and perform some debugging.
    Unfortunately I can't do it right now, as this functionality is kind
    of a byproduct of other features (so it doesn't yet look like a
    Cayenne bug to me), and I have to work on other things.

    I guess you'll have to poke around on your own. If you find more
    specific problems in the process, please let us know - maybe we can
    fix them, but I can't investigate this right now, sorry.

    Andrus

    On Apr 13, 2006, at 2:37 PM, emre.yilma..tr.com.tr wrote:

    > 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.readPropertyDirect
    > ly(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 - 07:04:59 EDT