Yes, the observed behavior is expected. I thought this was a question about 
getting a hold of an object fault (which localObject does), but this is 
essentially a variation of "A way to refreshObject()" topic. Let me answer in 
that thread. 

Andrus


> On Feb 22, 2017, at 4:02 PM, Musall, Maik <[email protected]> wrote:
> 
> Hi,
> 
> I tested it. It will not pick up the changes made in the other context. 
> Paraphrasing:
> 
> 1. create obj1 in oc1
> 2. create oc2, obj2 = oc2.localObject(obj1)
> 3. obj2.setSomething(newValue); oc2.commitChanges()
> 4. obj1.something() has still old value
> 5. obj1 = oc1.localObject(obj1), still old value
> 6. obj1 = oc1.localObject(obj2), still old value
> 
> Only when you create a new oc3 and localObject() in that, you will see the 
> changed value. Btw, I have this set:
> binder.bindMap(Constants.PROPERTIES_MAP).put(Constants.SERVER_CONTEXTS_SYNC_PROPERTY,
>  "false");
> 
> Using child contexts may be an option, but then the saves wouldn't hit the 
> database until I commit again in the parent context, which in my case the 
> processing routine has no business in.
> 
> Maik
> 
> 
> 
>> Am 22.02.2017 um 07:17 schrieb Andrus Adamchik <[email protected]>:
>> 
>> Since the task is to collect objects from multiple contexts in a single 
>> resulting context, you may use this:
>> 
>>  context.localObject(objectFromAnotherContext)
>> 
>> (I don't think anyone has mentioned "localObject" in this thread ??)
>> 
>> Andrus
>> 
>> 
>>> On Feb 15, 2017, at 7:17 PM, Musall, Maik <[email protected]> wrote:
>>> 
>>> The use case is as follows.
>>> 
>>> I have a large collection of objects which I want some function to be 
>>> executed on. I want to use multiple threads to do this, so AFAIK I have to 
>>> use separate ObjectContexts per thread like in EOF. So, I will then 
>>> instantiate those objects in the per-thread contexts, do the processing, 
>>> but then the wrapper function should return the entire collection of 
>>> processed objects in the original context that they were in at the 
>>> beginning.
>>> 
>>> With EOF, I have a snapshot cache that will contain the changed attributes, 
>>> but the EO instances in the original context have their original values. 
>>> So, I will then call ec.faultForGlobalID() to have them refaulted from the 
>>> snapshot cache, avoiding to refetch 100.000 objects from db.
>>> 
>>> I suppose using a shared cache would make the problem obsolete, as those 
>>> objects would receive changed attributes automatically, but I'm still on 
>>> the fence whether or not to use a shared cache, because it's a major 
>>> behavioural difference to EOF and I still have to think about that while 
>>> migrating my project.
>>> 
>>> Maik
>>> 
>>> 
>>>> Am 15.02.2017 um 15:49 schrieb Ken Anderson <[email protected]>:
>>>> 
>>>> Yes, use the objectID to pass around, but on the receiving end, you should 
>>>> turn it into a fault and release it into the wild.  Then, if some code 
>>>> needs it, the fault fires, otherwise – no DB activity.
>>>> 
>>>> Ken Anderson
>>>> CTO Amphora, Inc.
>>>> Mobile:   +1 914 262 8540
>>>> 
>>>> 
>>>> 
>>>> www.amphorainc.com <http://www.amphorainc.com/>
>>>> 
>>>> 
>>>> 
>>>> 
>>>> On 2/15/17, 10:47 AM, "Amedeo Mantica" <[email protected]> wrote:
>>>> 
>>>> I would just use the ObjectId
>>>> 
>>>>> On 15 Feb 2017, at 16:45, Hugi Thordarson <[email protected]> wrote:
>>>>> 
>>>>> It can be useful in some cases—one example is if you want to be able to 
>>>>> pass objects around in an API without triggering a DB fetch unless they 
>>>>> are actually used.
>>>>> 
>>>>> Cheers,
>>>>> - hugi
>>>>> 
>>>>> 
>>>>>> On 15. feb. 2017, at 15:28, Amedeo Mantica <[email protected]> wrote:
>>>>>> 
>>>>>> no worries, but I cannot understand your goal, why do you want to get 
>>>>>> the fault ?
>>>>>> 
>>>>>>> On 15 Feb 2017, at 16:25, Hugi Thordarson <[email protected]> wrote:
>>>>>>> 
>>>>>>> Thanks Ken, but the immediate fetch performed by Cayenne.objectForPk is 
>>>>>>> precisely what I’d like to avoid.
>>>>>>> 
>>>>>>> Cheers,
>>>>>>> - hugi
>>>>>>> 
>>>>>>> S: Amedeo, sorry about calling you “Amadeo” in my last post. I have 
>>>>>>> been properly lambasted.
>>>>>>> 
>>>>>>> 
>>>>>>>> On 15. feb. 2017, at 15:20, Ken Anderson <[email protected]> 
>>>>>>>> wrote:
>>>>>>>> 
>>>>>>>> I do this:
>>>>>>>> 
>>>>>>>> dataObject = (DataObject) Cayenne.objectForPK(getObjectContext(), 
>>>>>>>> MyEntity.class, oid);
>>>>>>>> 
>>>>>>>> But it will do the fetch if it’s not already in cache.
>>>>>>>> 
>>>>>>>> Ken
>>>>>>>> 
>>>>>>>> Ken Anderson
>>>>>>>> CTO Amphora, Inc.
>>>>>>>> Mobile:   +1 914 262 8540
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> www.amphorainc.com <http://www.amphorainc.com/>
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> On 2/15/17, 9:59 AM, "Hugi Thordarson" <[email protected]> wrote:
>>>>>>>> 
>>>>>>>> Thanks Amadeo, but I ended up creating a method that looks like this. 
>>>>>>>> It would be nice to get some feedback on it, if I’m violating any 
>>>>>>>> Cayenne Commandments.
>>>>>>>> 
>>>>>>>> /**
>>>>>>>> * @return An existing object or fault if registered with the OC, 
>>>>>>>> otherwise creates a new hollow object based on the given ObjectId.
>>>>>>>> */
>>>>>>>> public static Persistent faultForObjectId( ObjectContext oc, ObjectId 
>>>>>>>> objectId ) {
>>>>>>>> Persistent object = (Persistent) oc.getGraphManager().getNode( 
>>>>>>>> objectId );
>>>>>>>> 
>>>>>>>> if( object == null ) {
>>>>>>>> ClassDescriptor descriptor = 
>>>>>>>> oc.getEntityResolver().getClassDescriptor(objectId.getEntityName());
>>>>>>>> 
>>>>>>>> object = (Persistent) descriptor.createObject();
>>>>>>>> 
>>>>>>>> object.setPersistenceState(PersistenceState.HOLLOW);
>>>>>>>> object.setObjectContext(oc);
>>>>>>>> object.setObjectId(objectId);
>>>>>>>> 
>>>>>>>> oc.getGraphManager().registerNode(objectId, object);
>>>>>>>> }
>>>>>>>> 
>>>>>>>> return object;
>>>>>>>> }
>>>>>>>> 
>>>>>>>> Cheers,
>>>>>>>> - hugi
>>>>>>>> 
>>>>>>>> 
>>>>>>>>> On 15. feb. 2017, at 14:41, Amedeo Mantica <[email protected]> 
>>>>>>>>> wrote:
>>>>>>>>> 
>>>>>>>>> may be you want invalidateObject ?
>>>>>>>>> 
>>>>>>>>>> On 15 Feb 2017, at 14:15, Hugi Thordarson <[email protected]> wrote:
>>>>>>>>>> 
>>>>>>>>>> Hi all,
>>>>>>>>>> I need to get a fault for an ObjectId from an ObjectContext. How 
>>>>>>>>>> would I do this?
>>>>>>>>>> 
>>>>>>>>>> I don’t see any public API for this—the implementation of 
>>>>>>>>>> createFault in CayenneContext seems to get me halfway there, but it 
>>>>>>>>>> will not return an existing fault, only create new ones.
>>>>>>>>>> 
>>>>>>>>>> Cheers,
>>>>>>>>>> - hugi
>>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> Confidentiality Notice: This e-mail and accompanying documents contain 
>>>>>>>> confidential information intended for a specific individual and 
>>>>>>>> purpose. This e-mailed information is private and protected by law. If 
>>>>>>>> you are not the intended recipient, you are hereby notified that any 
>>>>>>>> disclosure, copying, or distribution, or the taking of any action 
>>>>>>>> based on the contents of this information, is strictly prohibited.
>>>>>>> 
>>>>>> 
>>>>> 
>>>> 
>>>> 
>>>> 
>>>> Confidentiality Notice: This e-mail and accompanying documents contain 
>>>> confidential information intended for a specific individual and purpose. 
>>>> This e-mailed information is private and protected by law. If you are not 
>>>> the intended recipient, you are hereby notified that any disclosure, 
>>>> copying, or distribution, or the taking of any action based on the 
>>>> contents of this information, is strictly prohibited.
>>> 
>> 
> 

Reply via email to