Re: DataContext synchronization bug ?

From: Jonathan Bélisle (jonathan.belisl..cda.ca)
Date: Mon Aug 28 2006 - 14:49:07 EDT

  • Next message: Mike Kienenberger: "Outer-join / auditing patch"

    Hi Marcin,

    I've already looked at localObject() and it's not good.
    Here's why ?

    You have a data object : dataObjectInContext1
    You modify a property : dataObjectInContext1.setName("the new name");
    You copy it to the second dataContext and modify it's persistenceState

        dataObjectInContext2=
    context2.localObject(dataObjectInContext1.getObjectId(),
    dataObjectInContext1);
        dataObjectInContext2.setPersistenceState(PersistenceState.MODIFIED);

    Everything is ok till now but here is the problem :

        dataObjectInContext2.commitChanges();

    Nothing will be written to the database because context2 did not track
    changes of dataObjectInContext2.
    That's why i'm not using localObject().
    Is there a way that dataObjectInContext2 will be committed using
    localObject() ?

    I'm using Cayenne 1.2

    Jonathan.

       
       

    Marcin Skladaniec wrote:
    > Hello Jonathan
    >
    > Please take a closer look on the localObject() method.
    > Straight from javadocs :
    > "Returns an object local to this DataContext and matching the
    > ObjectId. If prototype is not null, local object is refreshed with the
    > prototype values.
    >
    > In case you pass a non-null second parameter, you are responsible for
    > setting correct persistence state of the returned local object, as
    > generally there is no way for Cayenne to determine the resulting local
    > object state."
    >
    > If you have still problems please mention what version of cayenne are
    > you using.
    >
    > Marcin
    > -------------------------->
    > ish
    > http://www.ish.com.au
    > Level 1, 30 Wilson Street Newtown 2042 Australia
    > phone +61 2 9550 5001 fax +61 2 9550 4001
    >
    >
    > On 28/08/2006, at 6:33 AM, Jonathan Bélisle wrote:
    >
    >> Hi, maybe someone can help me here.
    >>
    >> I'm trying to copy a dataObject to another dataContext while keeping
    >> it's modified state so that it will be correctly committed to the db
    >> by the second dataContext.
    >>
    >> Let say we have an entity with an attribute Name and a relationship
    >> Category.
    >> The object 1000001 exist in the db and has a Name and a Category
    >>
    >> //Create the dataContext
    >> DataContext dc1= DataContext.createDataContext();
    >> DataContext dc2= DataContext.createDataContext();
    >>
    >> //Get object from db. Modify the name.
    >> Animal from= (Animal) DataObjectUtils.objectForPK(dc1, new
    >> ObjectId("Animal", "animalId", 1000001));
    >> from.setName("XXX" + new SecureRandom().nextInt());
    >>
    >> //Get local object to dc2
    >> //I cannot use dc2.localObject(from.getObjectId(), from);
    >> //because the dc2 won't see the modification made in dc1.
    >> Animal to= (Animal) dc2.localObject(from.getObjectId(), null);
    >> dc2.getObjectStore().resolveHollow(to);
    >>
    >> //Copy the attributes from object1 to object2 String attName;
    >> ObjAttribute objAttribute;
    >> ObjEntity objEntity=
    >> from.getObjectContext().getEntityResolver().lookupObjEntity(to);
    >> Iterator attributes = objEntity.getAttributes().iterator();
    >> while (attributes.hasNext()) {
    >> objAttribute = (ObjAttribute) attributes.next();
    >> attName= objAttribute.getName();
    >>
    >> to.writeProperty(attName, from.readPropertyDirectly(attName));
    >> }
    >> dc2.commitChanges();
    >>
    >> System.out.println(from);
    >> System.out.println(to);
    >>
    >> Everything is committed correctly to the db but the object from has
    >> now a Category = null
    >>
    >> The problem is after the dc2.commitChanges() and
    >> it comes from
    >> org.objectstyle.cayenne.event.EventManager.DispatchThread.run() witch
    >> is firing an event to set the relationship Category to null.
    >> I don't know why it is doing that.
    >> I am doing something wrong ? Is it a bug in cayenne ?
    >> And i need context synchronization so turning it off is not an option.
    >>
    >> I really need help on this one, can someone help me ?
    >>
    >> Jonathan
    >
    >
    >
    >
    >
    >
    >



    This archive was generated by hypermail 2.0.0 : Mon Aug 28 2006 - 14:49:34 EDT