cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jonathan Bélisle <jonathan.beli...@rcda.ca>
Subject Re: DataContext synchronization bug ?
Date Mon, 28 Aug 2006 18:49:07 GMT
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
>
>
>
>
>
>
>


Mime
View raw message