In general a Cayenne user may be dealing with an object graph that can potentially start at 1 entity and then span the entire DB (prefetches can be multi-step). So Cayenne can't guess for you which relationships need to be refreshed, without potentially incurring a gigantic query.
So it is still your responsibility as a user to tell it how much or how little to prefetch. And you can do something dynamic. E.g. if you decide that all the relationships you care about are only 1 level deep, you can find an ObjEntity and iterate through all relationships to add prefetches: SelectQuery q = ObjEntity entity = context.getEntityResolver().lookupObjEntity(MyClass.class); for(Relationship r : entity.getRelationships) { q.addPrefetch(r.getName()); } Andrus On Sep 2, 2011, at 1:51 PM, Anthony Brew wrote: > Hi Andrus, > Yeah thats the most viable solution I have found so far, but > tbh but from a code point of view here I think its a risky option as it > could introduce bugs, it not all changing properties are added to the > prefetch. > > query.addPrefetch(Item.SUB_ITEMS_PROPERTY); > > Would be nice to have a way when the NO_CACHE item is specified to make sure > linked objects are pulled fresh also. > > Thanks a million for all your help. > Anthony > > On Fri, Sep 2, 2011 at 6:04 PM, Andrus Adamchik <and...@objectstyle.org>wrote: > >> To refresh a relationship, you may use a prefetch on the query: >> >> >> >> >> Andrus >> >> >> On Sep 2, 2011, at 12:51 PM, Joseph Senecal wrote: >> >>> I think the generated code for the getter() should always return the >> existing list because that is the whole point of an ORM, to manage an object >> graph in memory. >>> >>> But it should be easy to override that getter() method in the generated >> subclass to always do an uncached query. >>> >>> Joe >>> >>> On Sep 2, 2011, at 9:45 AM, Mike Kienenberger wrote: >>> >>>> There may be a better way, but one obvious way this could be done is to >>>> change the code generation so that the getter() executes a select query >>>> rather than returning an existing list. >>>> >>>> On Fri, Sep 2, 2011 at 11:28 AM, Anthony Brew <anthony.b...@swrve.com >>> wrote: >>>> >>>>> Hi, >>>>> Just an update, and I think I forgot to include something important >>>>> Its a one to many relationship that I am seeing cached, (ie I fetch >> "Item" >>>>> and the many to one "Item.getSubItems()" are being fetched from the >> cache) >>>>> >>>>> My code now looks a bit like: >>>>> >>>>> Expression e1 = Expression.fromString("id = $id"); >>>>> Map params = new HashMap(); >>>>> params.put("id", item.getId()); >>>>> >>>>> SelectQuery query = new SelectQuery(Item.class, >>>>> e1.expWithParameters(params)); >>>>> query.setCacheStrategy(QueryCacheStrategy.NO_CACHE); >>>>> >>>>> List items = context.performQuery(query); >>>>> if(items.size() != 1){ >>>>> throw new RuntimeException(""); >>>>> } >>>>> freshitem = (Item) items.get(0); >>>>> >>>>> subitems = freshitem.getSubItems() >>>>> >>>>> Where subitems are stale. >>>>> >>>>> I am sure I am making this more complicated than needs be. As I >> mentioned >>>>> before I would like to turn on some flag to essentially always read >> from DB >>>>> when I do items.getSubItems() if possible, or when I reload the Item >> when >>>>> its getter methods are called to make it always read from the DB the >> first >>>>> time when QueryCacheStrategy.NO_CACHE is specified... >>>>> >>>>> Thanks a Million, >>>>> Anthony >>>>> >>>>> >>>>> On Fri, Sep 2, 2011 at 3:54 PM, Mike Kienenberger <mkien...@gmail.com >>>>>> wrote: >>>>> >>>>>> You may want to review these two threads from the end of July: >>>>>> >>>>>> OSCache is gone >>>>>> http://www.mail-archive.com/dev@cayenne.apache.org/msg06209.html >>>>>> >>>>>> EhCache integration preview >>>>>> http://www.mail-archive.com/user@cayenne.apache.org/msg06211.html >>>>>> >>>>>> >>>>>> On Fri, Sep 2, 2011 at 10:30 AM, Anthony Brew <anthony.b...@swrve.com >>>>>>> wrote: >>>>>> >>>>>>> Hi Andrus, >>>>>>> I was just about to get back to you on, I accidentally >>>>>>> started two threads when I joined the mailing list. >>>>>>> >>>>>>> Essentially we have a ruby on rails project that creates config on >> the >>>>>>> front >>>>>>> end, this is the part that is changing externally. Then internally we >>>>>> read >>>>>>> these config and do a bunch of processing and write the results to a >>>>>>> separate set of tables. The tables are in turn read by the R on R app >>>>> but >>>>>>> never written to >>>>>>> >>>>>>> so >>>>>>> Tables Set A | Set B >>>>>>> >>>>> >> ------------------------------------------------------------------------ >>>>>>> Rails read and write | read only >>>>>>> Java read only | read and write >>>>>>> >>>>>>> The issues I am facing are with set A changing in the app. >>>>>>> >>>>>>> I have tried forcing the Item to reload by doing this, (I cut code >> from >>>>>>> Cayennes: DataObjectUtils.objectForPK(threadDataContext, >>>>> Item.class, >>>>>>> dirtyItem.getId());) >>>>>>> >>>>>>> private Item getItemWithNoCayenneCache(Item newGame, DataContext >>>>>>> threadDataContext) { >>>>>>> ObjectId gameIdentifier = buildId(threadDataContext, Game.class, >>>>>>> newGame.getId()); >>>>>>> >>>>>>> return (Item) DataObjectUtils.objectForQuery(threadDataContext, >>>>>> new >>>>>>> ObjectIdQuery( >>>>>>> gameIdentifier, >>>>>>> false, >>>>>>> ObjectIdQuery.CACHE_REFRESH)); >>>>>>> } >>>>>>> } >>>>>>> >>>>>>> >>>>>>> stepping into *DataObjectUtils.objectForQuery stepping into the >> Cayenne >>>>>>> code >>>>>>> I eventually get to DataContext.java* >>>>>>> * >>>>>>> * >>>>>>> where I see the following method called >>>>>>> >>>>>>> * >>>>>>> @Override >>>>>>> @SuppressWarnings("unchecked") >>>>>>> public List performQuery(Query query) { >>>>>>> query = nonNullDelegate().willPerformQuery(this, query); >>>>>>> if (query == null) { >>>>>>> return new ArrayList<Object>(1); >>>>>>> } >>>>>>> >>>>>>> List result = onQuery(this, query).firstList(); >>>>>>> return result != null ? result : new ArrayList<Object>(1); >>>>>>> } >>>>>>> * >>>>>>> >>>>>>> however i see that the delgate in * >>>>>>> nonNullDelegate() is null and so I get back NoopDelegate.noopDelegate >>>>>> which >>>>>>> I assume is the route of my woes. >>>>>>> * >>>>>>> * >>>>>>> >>>>>>> * >>>>>>> Im interested in trying the OSCache solution you proposed in my other >>>>>>> thread, but I am a little wary the code is stale as my maven >>>>> dependancies >>>>>>> fail (I am actually pretty new to maven so this might be my bad). >>>>>>> OSCache appears to be quite old since the OpenSymphony project died, >>>>>> maybe >>>>>>> my maven config is off, are there still active contributors? >>>>>>> >>>>>>> In my pom I have specified >>>>>>> <dependency> >>>>>>> <groupId>opensymphony</groupId> >>>>>>> <artifactId>oscache</artifactId> >>>>>>> <version>2.4</version> >>>>>>> </dependency> >>>>>>> >>>>>>> however the dependancies on >>>>>>> >>>>>>> - javax.jms:jms:1.1 >>>>>>> >>>>>>> Thanks a Million >>>>>>> Anthony >>>>>>> >>>>>>> >>>>>>> On Fri, Sep 2, 2011 at 2:34 PM, Andrus Adamchik < >>>>> and...@objectstyle.org >>>>>>>> wrote: >>>>>>> >>>>>>>> Could you please explain your data access patterns? >>>>>>>> >>>>>>>> E.g. if you fetch some objects and store them in an instance >> variable >>>>>> in >>>>>>>> your application, they are not going to get refreshed automatically. >>>>> To >>>>>>>> refresh objects you need to either invalidate them explicitly via >>>>>>>> context.invalidateObjects() or run a query. All the cache settings >>>>> are >>>>>>>> essentially about optimizing query execution (refresh data, but only >>>>> as >>>>>>>> often as needed). >>>>>>>> >>>>>>>> Andrus >>>>>>>> >>>>>>>> On Sep 2, 2011, at 9:28 AM, Anthony Brew wrote: >>>>>>>> >>>>>>>>> Hi Gary, >>>>>>>>> Yeah thats what I am seeing in the code, but I cant for >>>>>> the >>>>>>>> life >>>>>>>>> of me see how to turn off the caching completely in the modeller, I >>>>>>>> actually >>>>>>>>> think it wont hit our performance very badly to have no caching. >>>>>>>>> >>>>>>>>> The cache setting I see are the in the DataDomain Configuration >>>>>>>>> >>>>>>>>> Which has an option for a Query Cache Factory with a choice of two >>>>>>>> classes. >>>>>>>>> - org.apache.cayenne.cache.MapQueryCacheFactory >>>>>>>>> - org.apache.cayenne.cache.OSQueryCacheFactory >>>>>>>>> >>>>>>>>> I selected the MapQueryCache and trie to set the size of the object >>>>>>> cache >>>>>>>> to >>>>>>>>> 1 (couldn't set this to zero) as the application barfed saying >>>>> caches >>>>>>> had >>>>>>>> to >>>>>>>>> be greater than size zero. >>>>>>>>> >>>>>>>>> in my cayenne.xml I see the line >>>>>>>>> >>>>>>>>> <property name="cayenne.DataRowStore.snapshot.size" value="1"/> >>>>>>>>> >>>>>>>>> was added, perhaps there is some manual setting I can add to this >>>>>> file >>>>>>> to >>>>>>>>> turn caching off? >>>>>>>>> >>>>>>>>> All the Best, >>>>>>>>> Anthony >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On Fri, Sep 2, 2011 at 12:20 AM, Gary Jarrel <garyjar...@gmail.com >>>>>> >>>>>>>> wrote: >>>>>>>>> >>>>>>>>>> I'd say that would be cache related, as Cayenne is caching the >>>>> data >>>>>>>>>> from the database, switch the cache of in the Modeler perhaps and >>>>>> that >>>>>>>>>> should fix your problem. >>>>>>>>>> >>>>>>>>>> G >>>>>>>>>> >>>>>>>>>> On Fri, Sep 2, 2011 at 3:04 AM, Anthony Brew < >>>>>> anthony.b...@swrve.com> >>>>>>>>>> wrote: >>>>>>>>>>> Hi, >>>>>>>>>>> I have a two processes one which writes to a several database >>>>>>> tables >>>>>>>>>> (a >>>>>>>>>>> ruby on rails application) and a java application that reads the >>>>>>> state >>>>>>>>>> these >>>>>>>>>>> data base tables using Cayenne and writes to other tables. >>>>>>>>>>> >>>>>>>>>>> When the ruby modifies the underlying data-base I am seeing that >>>>>>>> Cayenne >>>>>>>>>> is >>>>>>>>>>> not automatically picking up that the underlying data is now >>>>>>>> inconsistant >>>>>>>>>>> and not reloading. Is there some way I can config Cayenne to >>>>>>> aggressive >>>>>>>>>>> check some tables for updates while ignoring others? >>>>>>>>>>> >>>>>>>>>>> Thanks a Million >>>>>>>>>>> Anthony Brew >>>>>>>>>>> >>>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>> >>> >> >>