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
> 

Reply via email to