Hi Christian, Sorry, I think I am bit lost. Pieces of code shown in this thread don't fall together in one sequence of events in my head, so I can't give specific advice and can only keep guessing. The first message with pseudo code didn't sound right at all.
> But if a make up a new request > and select the User, it claims it has no roles which leads to a > failure. Do you prefetch the roles when fetching a user (as in SelectQuery.addPrefetch(..))? That's one possible way to refresh relationships. Andrus On Sep 16, 2011, at 12:40 PM, Christian Grobmeier wrote: >>> ObjectContext ctx = // get context >>> User user = ctx.newObject(User.class); >>> ObjectContext ctx = // get another context (from ThreadLocal - should be >>> the same?) >> >> If this whole piece of code is from the same request, and the first context >> is obtained from ThreadLocal, then the contexts should be the same. (A >> potential race condition - how did the context got into ThreadLocal in the >> first place? If it comes from the session, multiple request threads can get >> the same context, if the user clicks quickly or there's lots of AJAX calls >> on the pages). > > > I use the CayenneFilter in my web.xml. Once a request comes in, it > looks like it is the SessionContextRequestHandler who creates my > context and binds it to the current thread. > > Basically it is three steps: register, activate and then login what > user does. It fails when the user does his login (sometimes). At this > point there is no ajax at all, just plain stuff. > > > > >>> After your explaination my guess is that I am not allowed to call this: >>> BaseContext.getThreadObjectContext(); >>> twice before I commit. Does this make sense? >> >> No, you can call getThreadObjectContext as many times as you need. You get >> the same context within request, which is probably what you want. > > > Yes, exactly. > >> >> >>> <query name="getUserRole" >>> factory="org.apache.cayenne.map.SelectQueryBuilder" root="obj-entity" >>> root-name="Role"> >>> <property name="cayenne.SelectQuery.distinct" value="true"/> >>> <property name="cayenne.GenericSelectQuery.cacheStrategy" >>> value="SHARED_CACHE"/> >>> <qualifier><![CDATA[name = "user"]]></qualifier> >>> </query> >> >> This query fetches Roles, not UserRoles. From your earlier messages, you >> were actually looking for UserRoles, and then traversing relationships to >> Roles from them, no? > > > My "design" is: User <-> UserRoles <-> Roles > > I have a fixed role like "user" or "admin" in the roles table. I want > to select the existing user role from the table (I do it by the name, > which is some kind of key for me) and add it to a user with creating a > new UserRoles object. > > This is actually were is it seems to fail. In my database all three > entities are existing and look good. But if a make up a new request > and select the User, it claims it has no roles which leads to a > failure. > > My guts say it might also be somehow caching related. When I login i > create a simple SelectQuery which selects the User.class by login > name. Might it be a good idea to make something like this? > > SelectQuery query = ... > query.setCacheStrategy(QueryCacheStrategy.NO_CACHE); > > It would give me a very bad taste in my mouth if I would need that. > > Cheers, > Christian > > >> Andrus > > > > -- > http://www.grobmeier.de >
