Hello !
I think you have it all right, but just in case:
dataObjectInContext2= context2.localObject
(dataObjectInContext1.getObjectId(), dataObjectInContext1);
dataObjectInContext2.setPersistenceState
(dataObjectInContext1.getPersistenceState() ); //In case that the
object 1 state is NEW
context2.commitChanges();
Is it that dead simple or you are doing some more things ?
I don't see a reason why it is not working for you.
Marcin
On 29/08/2006, at 4:49 AM, Jonathan Bélisle wrote:
> 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
>>
>>
>>
>>
>>
>>
>>
>
-------------------------->
ish
http://www.ish.com.au
Level 1, 30 Wilson Street Newtown 2042 Australia
phone +61 2 9550 5001 fax +61 2 9550 4001
This archive was generated by hypermail 2.0.0 : Mon Aug 28 2006 - 19:15:19 EDT