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