Hi,
Still not working.
Is it the normal behavior of localObject() or is it a bug ?
It seems to me that there should be a way to copy a modified object to a
different dataContext
while keeping it's modification info.
Maybe I'm not doing it the right way.
Maybe localObject() is not the right way.
Somebody know the right way ?
Jonathan
Marcin Skladaniec wrote:
> Hi
> I'm not using localObject with prototype at the moment. I had some
> problems with it as well.
> Please try after doing localObject retouching some attribute, like
> dataObjectInContext2.setName(getName()), commit and see if this will
> put to the database only the new name.
>
> Marcin
>
> On 29/08/2006, at 10:53 AM, Jonathan Bélisle wrote:
>
>> 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
>>>
>>>
>>>
>>>
>>>
>>
>
> -------------------------->
> 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 : Tue Aug 29 2006 - 16:30:34 EDT