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");
.
.
.
ctxt.commitChanges();
-----------------------------------------------
Action that fetches SOLUTIONS
DataContext ctxt = DataContext.getThreadDataContext();
.
.
Solution aSolution = (Solution)
DataObjectUtils.objectForPK(ctxt, Solution.class,
new Integer("1"));
.
.
.
// This line below is where the error occurred
if
(aSolution.getToSolutionType().getSolutionType().compareTo("TYPE1")==0){
.
.
;
}
Cayenne reports this error:
org.objectstyle.cayenne.CayenneRuntimeException:
[v.1.1 December 6 2004] Error resolving fault, no
matching row exists in the database for ObjectId:
au.com.hybrid.comone.db.beans.SolutionType:
<solution_type: TYPE1>
org.objectstyle.cayenne.CayenneDataObject.resolveFault(CayenneDataObject.java:219)
org.objectstyle.cayenne.CayenneDataObject.readProperty(CayenneDataObject.java:227)
.
.
.
__________________________________
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 - 05:46:41 EST