Yes, the DataContext is bound in web.xml.
You were right, I'm renaming the PK.
But I just found out that the bug only occurred in
that
relation (Solution & SolutionType table).
In other tables (with similar relationship, renaming
the PK), it works fine.
I wonder why I have to use the native way to get the
"updated" object from database for this
relationship...
Regards,
Alex Wibowo
--- Cris Daniluk <cris.danilu..laraview.com> wrote:
> I don't even know where to begin with this since
> there are about 4 pages of
> emails here, but here I go... :)
>
> You gave a lot of information and I think most of it
> is probably not needed.
> What stood out in my mind was that it appears that
> SOLUTION_TYPES is a 1
> field table and you are renaming the pk. This is
> bad... Pks are not for
> renaming and Cayenne could easily be confused if you
> are doing that.
>
> Another note:
>
> You are using DataContext.getThreadDataContext()
>
> How are you putting the context in the thread? Did
> you add a listener to the
> web.xml? Please show that. If that is right, then
> you are doing exactly the
> right thing as far as that goes.
>
> Cris
>
> > It seems that this is a bug in Cayenne.
> >
> > Coz the following works:
> >
> > Code to retrieve SOLUTION object:
> >
> > DataContext ctxt =
> > DataContext.getThreadDataContext();
> > .
> > .
> > .
> >
> > Expression template =
> > Expression.fromString("db:solution_id=$value1");
> > Map params = new HashMap();
> > params.put("value1", solutionId);
> > Expression qual =
> > template.expWithParameters(params);
> > SelectQuery query = new
> > SelectQuery(Solution.class, qual);
> > List result = ctxt.performQuery(query);
> > Solution aSolution = (Solution)
> result.get(0);
> >
> > if (aSolution==null){
> > logger.error("The requested Solution
> cannot be
> > found in database");
> > errors.add(ActionErrors.GLOBAL_ERROR,
> new
> >
>
ActionMessage("error.admin.db.query",solutionId,"solution"));
> > return null;
> > }
> >
> >
> > ----------------
> > The code above will "see" the updated object, and
> not the old one..
> >
> > :( Do i have to change this in all my code.???
> > Is there any better solution???
> >
> >
> > Thanks a lot!
> >
> >
> > Best regards,
> >
> >
> >
> > Alex Wibowo.
> >
> >
> > --- Alex Gunawan Wibowo <netzone_tec..ahoo.com>
> > wrote:
> > > Hello,
> > >
> > > i'm experiencing a problem with DataContext's
> > > getThreadDataContext() method.
> > >
> > > Say I have two tables..
> > >
> > > SOLUTIONS, with attributes: solution_id(PK),
> solution_name,
> > > solution_type (FK to SOLUTION_TYPES)
> > >
> > > SOLUTION_TYPES, with attributes:
> solution_type(PK)
> > >
> > >
> > > I'm using Struts, and in an Action, I call the
> > > DataContext.getThreadDataContext() method to get
> the DataContext
> > > object, perform an update on a record
> SOLUTION_TYPES, say, changing
> > > TYPE1 to TYPE2.
> > >
> > > Now, I have a record in SOLUTIONS TABLE that's
> referring to the
> > > SOLUTION_TYPES table, say a record
> > > like:
> > > 1, SolutionName1, TYPE1
> > >
> > > The 1st update is successful. Viewing all
> solution types in the
> > > database showed that the value has been updated.
> > > Since I'm using MS SQL server, I'm able to view
> the values
> > in database
> > > directly. The values have been updated
> correctly:
> > > --------------------
> > > SOLUTION_TYPES
> > > * TYPE2
> > >
> > > SOLUTIONS
> > > * 1, SolutionName1, TYPE2
> > >
> > > --------------------
> > >
> > > Now, I have another Action to edit the Solutions
> record,
> > and I wanted
> > > to display the current information in the page.
> So, I called
> > > DataContext.getThreadDataContext() in this
> Action, and use
> > it to fetch
> > > Solution ID 1.
> > > Strangely, this fetched object still have the
> following information:
> > > 1, SolutionName1, TYPE1
> > > Although the value in database clearly have
> changed.
> > > Ultimately, my application crashed.
> > >
> > > It seems that the old record is still in the
> memory, and
> > hence Cayenne
> > > did not refetch the object, and not knowing that
> solution with id 1
> > > has been changed in DB to TYPE2. This is true,
> since if I
> > restart the
> > > application (restarting Tomcat), Cayenne fetch
> > > Solution with ID 1 as 1, SolutionName1, TYPE2.
> > >
> > > My question: how do I make it so that Cayenne
> does not fetch the
> > > object from the memory??
> > > Do i have to use:
> > >
> > > DataContext context =
> > >
> >
>
BasicServletConfiguration.getDefaultContext(session);
> > >
> > > to solve this problem??? (Please don't say
> yes... it would require
> > > significant changes in my application.... :( )
> > >
> > >
> > >
> > > Thanks a lot for the help! Sorry for the lengthy
> email....
> > >
> > >
> > > Best regards,
> > >
> > >
> > > Alex Wibowo
> > >
> > > By the way, the portion of code is here:
> > >
> > > ----------------------------------------------
> > > Action that perform modification for
> SOLUTION_TYPES
> > >
> > > DataContext ctxt =
> > > DataContext.getThreadDataContext();
> > > .
> > > .
> > > .
> > > Expression qual =
> > > ExpressionFactory.matchExp("solutionType",
> "TYPE1");
> > SelectQuery query
> > > = new SelectQuery(SolutionType.class, qual);
> List result =
> > > ctxt.performQuery(query); SolutionType aType =
> (SolutionType)
> > > result.get(0); .
> > > .
> > > .
> > > aType.setSolutionType("TYPE2");
>
=== message truncated ===
__________________________________
Celebrate Yahoo!'s 10th Birthday!
Yahoo! Netrospective: 100 Moments of the Web
http://birthday.yahoo.com/netrospective/
This archive was generated by hypermail 2.0.0 : Tue Mar 08 2005 - 19:42:18 EST