Hi,
It should work but it does not.
context2.commitChanges() won't send an update statement to the database
if the object was modified in context1.
I think it's not working because context2 was not notified of the
changes made to dataObject while it was in context1.
Is it working for you ?
Try the code from the previous post. You will see that nothing gets
written to the database on commit.
If it does well..... there's something wrong somewhere :)
Jonathan
Marcin Skladaniec wrote:
> 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 - 20:53:34 EDT