Hi Marcin, thanks for your answer!
I tried with def strategy (NO_CACHE) or SHARED_CACHE - that makes no
difference. But anyways, I definitely want my relationships be
refreshed without any more SelectQueries, i.e. objects in memory be
invalidated automatically.
For sure, b) and Ó)
will work - this is roughly the same as restarting the client. I
haven't tried a), but this is no better than my workaround because I
need to manually
specify objects for refresh. What I wish is all objects *with their
rels* be refreshed when I perform full
RefreshQuery() [no parameters here].
Still, there's some debate about how this could be done,
because invalidating all rels will greatly decrease performance (I feel this
event if I manually invalidate three
ObjRelationships) and otherwise - how to check, which relationshps are
to be invalidated (i.e. which rows were inserted/deleted into
database).
Current client implementation, as long as I understood, just updates already
loaded objects, walking along using visitToOne() and visitToMany() methods.
About your suggestion, definitely I would want to use registeredObjects()
instead of uncommitedObjects(), because I don't know which objects (rels)
were modified behind the scenes. And I really want toMany relationships be
refreshed, so my workaround will go, I only need to make it more generic.
Thanks,
Andrey
2008/6/25, Marcin Skladaniec <marcin@ish.com.au>:
>
> Hi
>
> This was something I reported before , but I cannot find the message
> anymore.
> Are you using caching ? what type ? are you using cache keys ?
>
> Try:
> a) new RefreshQuery(artist)
> b) do a query in new context
> c) do a query in new context with no caching.
>
> In our setup we have overriden the CayenneContext commitChanges and
> performQuery methods.
> The latter attaches cache keys based on the query object, the former
> executes RefreshQuery(String[] cacheKeys) based on uncommittedObjects()
>
> It does help in most occasions, but still getting counts of toMany
> relationships is not refreshed.
>
> Marcin
>
> On Tue, 24 Jun 2008 14:37:43 +0400
> "Andrey Razumovsky" <razumovsky.andrey@gmail.com> wrote:
>
>> Hi!
>>
>>
>> I can't figure out how to make the refreshing query work with inserting or
>> deleting rows in database. For instance:
>>
>>
>> Artist a = ...
>>
>> assert a.getPaintingsArray().size() == 0;
>>
>>
>> //here is direct insert into database a painting of artist a (artistid=
>> a.id
>> )
>>
>>
>> RefreshQuery refresher = new RefreshQuery();
>>
>> context.performGenericQuery(refresher);
>>
>>
>> assert a.getPaintingsArray().size() == 1; //that's false
>>
>>
>>
>> Everything works perfect when I sql-update in database. When i sql-delete,
>> i do also get an exception like this:
>>
>> org.apache.cayenne.FaultFailureException: [v.3.0M4 May 18 2008 16:32:02]
>> Error resolving fault, no matching row exists in the database for
>> ObjectId:
>> <ObjectId:Apkforecast, apkforecastid=3>
>>
>> at org.apache.cayenne.BaseContext.prepareForAccess(BaseContext.java:100)
>>
>> at com.nic.rainbow.data.auto._Apkforecast.getDate(_Apkforecast.java:29)
>>
>> ...and so on
>>
>> when i try to iterate through related array
>>
>>
>> I'm using ROP if that helps. By the way, when i restart client, the data
>> becomes correct, so i assume everything has changed correctly on a server.
>>
>> If that's not supported, can you give me some advice to manually refresh
>> the
>> desired relationships?
>>
>>
>> Thanks,
>>
>> Andrey
>>
>
>
This archive was generated by hypermail 2.0.0 : Wed Jun 25 2008 - 03:50:44 EDT