John, I don't think you are missing the point and that looked promising. But it looks like RefreshQuery is a 3.0 bean and not available in 2.0.4.
-Chad ----- Original Message ----- From: "John Armstrong" <siber...@gmail.com> To: user@cayenne.apache.org Sent: Wednesday, January 7, 2009 8:33:08 AM GMT -07:00 US/Canada Mountain Subject: Re: A little help w/ session state please This I think may be more of a cayenne problem. You have to reload the object to destroy the cayenne cache using something like RefreshQuery. Thats what I have to do in many cases. Like this: context.deleteObject(theFeed); context.commitChanges(); context.commitChangesToParent(); context.performQuery(new RefreshQuery(theFeed)); I may be missing the point entirely, sorry :) John- On Wed, Jan 7, 2009 at 6:04 AM, Chad Smith <chadksmi...@gmail.com> wrote: > I have a web app that uses Cayenne 2.0.4 w/ Spring and it uses a servlet > filter to manage the data context ... > > Request init code > -------------------------------- > HttpSession session = ((HttpServletRequest)servletRequest).getSession(true); > DataContext dataContext = ServletUtil.getSessionContext(session); > DataContext.bindThreadDataContext(dataContext); > > > Request destroy code > -------------------------------- > DataContext dataContext = DataContext.getThreadDataContext(); > if (dataContext.hasChanges()) { > dataContext.rollbackChanges(); > } > DataContext.bindThreadDataContext(null); > > ... I also have a parent table and child table in which the child table has a > circular reference to itself > > parent table: Forum > > forum.forum_id > > child table: forum_thread > > forum_thread.forum_id > forum_thread.thread_id > forum_thread.parent_thread_id (the circular reference) > > ... here is the cayenne mapping xml for the relationships ... > > <db-relationship name="forumToThread" source="forum" target="forum_thread" > toMany="true"> > <db-attribute-pair source="forum_id" target="forum_id"/> > </db-relationship> > <db-relationship name="subThreadToThread" source="forum_thread" > target="forum_thread" toMany="false"> > <db-attribute-pair source="parent_thread_id" target="thread_id"/> > </db-relationship> > <db-relationship name="threadToForum" source="forum_thread" target="forum" > toMany="false"> > <db-attribute-pair source="forum_id" target="forum_id"/> > </db-relationship> > <db-relationship name="threadToSubThread" source="forum_thread" > target="forum_thread" toMany="true"> > <db-attribute-pair source="thread_id" target="parent_thread_id"/> > </db-relationship> > <obj-relationship name="forumToThread" source="Forum" target="Thread" > deleteRule="Cascade" db-relationship-path="forumToThread"/> > <obj-relationship name="subThreadToThread" source="Thread" target="Thread" > db-relationship-path="subThreadToThread"/> > <obj-relationship name="threadToForum" source="Thread" target="Forum" > db-relationship-path="threadToForum"/> > <obj-relationship name="threadToSubThread" source="Thread" target="Thread" > deleteRule="Cascade" db-relationship-path="threadToSubThread"/> > > ... here is the code I'm using to delete a thread ... > > public boolean deleteThread(int threadId) throws DataAccessException { > // NOTE: transactions are auto commit unless otherwise specified! > Thread thread = loadThread(threadId); > > // remove any parent association > if (thread.getSubThreadToThread() != null) { > Thread parentThread = thread.getSubThreadToThread(); > parentThread.removeFromThreadToSubThread(thread); > } > > // remove forum association > Forum forum = thread.getThreadToForum(); > forum.removeFromForumToThread(thread); > > super.delete(thread); > return true; > } > > ... so here is the problem: I setup the following data > > Forum record which has 3 top level thread records. Lets say thread 2 has > several children and several grand children. When I delete one of thread 2's > children it does the database deletes perfectly (cascade deletes of the > correct grandchildren), however, the gui continues to show the grand children > but the child record (that was deleted) is gone. Here is the SQL and the data > context looks clean before and after processing .... > > CayenneDao >>> --------------- Cayenne Context: 2009-01-07 06:49:40 > ---------------- > - hasChanges = false | isTransactionEventsEnabled = false | > isUsingSharedSnapshotCache = true | isValidatingObjectsOnCommit = true > 2009-01-07 06:49:40,953 INFO (QueryLogger.java:423) - --- will run 1 query. > 2009-01-07 06:49:40,953 INFO (QueryLogger.java:377) - --- transaction started. > 2009-01-07 06:49:40,953 INFO (QueryLogger.java:300) - DELETE FROM > gtools.forum_thread WHERE thread_id = ? > 2009-01-07 06:49:40,953 INFO (QueryLogger.java:322) - [bind: 228] > 2009-01-07 06:49:40,968 INFO (QueryLogger.java:368) - === updated 1 row. > 2009-01-07 06:49:40,968 INFO (QueryLogger.java:322) - [bind: 227] > 2009-01-07 06:49:40,968 INFO (QueryLogger.java:368) - === updated 1 row. > 2009-01-07 06:49:40,968 INFO (QueryLogger.java:322) - [bind: 226] > 2009-01-07 06:49:40,968 INFO (QueryLogger.java:368) - === updated 1 row. > 2009-01-07 06:49:41,015 INFO (QueryLogger.java:384) - +++ transaction > committed. > CayenneDao >>> --------------- Cayenne Context: 2009-01-07 06:49:41 > ---------------- > - hasChanges = false | isTransactionEventsEnabled = false | > isUsingSharedSnapshotCache = true | isValidatingObjectsOnCommit = true > > ... no matter where I go w/in the application the data (grand children) seems > to stick in the cache but if I log off and back on they are now gone (no > longer in the object cache). What am I doing wrong here? I know that is a > lot to wade through but I would greatly appreciate any help on diagnosing the > problem. > > Thanks in advance. > Chad >