If you want fresh data you shouldn't use .localCache() or you should pass a cache strategy to refresh the cache.
You can also force objects to be refreshed on the next access or query by using ObjectContext.invalidateObjects. On Tue, Jul 31, 2018 at 6:35 PM kw...@tybera.com <kw...@tybera.com> wrote: > I have a situation where multiple applications can make changes to the > database, and I need to be able pull data from the database and not use > cached data. > > We were running with cayenne 3.1M3 but I found documentation that > indicated that SelectById may be better suited to do what I wanted than > Cayenne.objectForPK which we were using - but I needed to update. So I > downloaded version 4.0.RC1 and changed this: > Employee existingUserInfo = Cayenne.objectForPK(context, > Employee.class, userInfo.getId()); > to this: > ObjectContext context = cayenneRuntime.getContext(); > Employee existingUserInfo = SelectById.query(Employee.class, > userInfo.getId()).localCache().selectOne(context); > > This appears to have solved my problem. However, I found that where I was > calling SQLTemplate to get the Employee, that I am not getting the latest > information because of the cache. I switched these to use SQLSelect rather > than SQLTemplate hoping that SQLSelect would act like SelectById, but it is > not. > > Here is what I put in to try to test this: > String sql = "SELECT * from Employee " > + " WHERE login_Id = > #bind($loginId) " > + " and historical_Date is null "; > > ObjectContext context = > cayenneRuntime.getContext(); > Employee emp = SQLSelect.query(Employee.class, > sql).params("loginId", userName).localCache().selectOne(context); > if (emp == null) return null; > System.out.println("emp middleName=" + > emp.getMiddleName()); > Employee emp2 = SelectById.query(Employee.class, > emp.getObjectId()).localCache().selectOne(context); > System.out.println("emp2 middleName=" + > emp.getMiddleName()); > > I access the Employee in my application, and then I change the middle name > of the employee in the database. The first call uses SQLSelect to get > Employee emp based on their loginId. Then I use SelectById to get the > same Employee in emp2 based on the objectId for emp. The calls follow the > same pattern of specifying localCache and selectOne with the same context. > However SQLSelect is not picking up the changed middle name, while > SelectById does. > > What is the best approach to handling this? I see that SQLSelect is a > replacement for SQLTemplate with the new fluid approach, but I am hoping > that I can switch to ObjectSelect and it will behave as SelectById. I also > wonder if I should be using ObjectContext context = runtime.newContext(); > rather than runtime.getContext(); > > I am planning on updating to the new 4.1.M2 release. I don't know if this > gives me more/better options. > > > > > >