>> 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
