OK: I've fixed the problem.
I'm not sure why this was the case, but here is what was causing the
problem:
In my ModelDriven action, I had a method like this:
public Collection<ProjectType> getAllProjectTypes(){
return this.projectTypeDao.getAll();
}
Notice that instead of returning a simple instance reference, this method
actually returned the result of a JPA query (via the DAO method call).
This method was used by a struts 2 iterator tag to populate a select list
on the form and was thus called when my "input" JSP rendered after an
invalid request.
I noticed that in the stack trace of my Oracle constraint violation, it
was actually this query call that was triggering the Session.flush() call
that was inappropriately saving the invalid entity state to the database.
By "pre-loading" the collection in the prepare() method like so:
public void prepare() throws Exception {
....
this.allProjectTypes = this.projectTypeDao.getAll();
}
public Collection<ProjectType> getAllProjectTypes(){
return this.allProjectTypes;
}
... the problematic flush() goes away.
Beats me why this matters. I'm sure a JPA guru could explain something
about the Transaction or EntityManager instance being different in the two
cases, but I don't understand it yet.
Jon French
Programmer
ASRC Management Services
ECOS Development Team
[EMAIL PROTECTED]
970-226-9290
Fort Collins Science Center
US Geological Survey
2150 Centre Ave, Building C
Fort Collins, CO 80526-8116
[EMAIL PROTECTED]
10/01/2007 08:29 PM
Please respond to
"Struts Users Mailing List" <[email protected]>
To
"Struts Users Mailing List" <[email protected]>
cc
Subject
Re: ModelDriven CRUD validation failure still causes JPA update
Unfortunately, it appears that xworks validation works not on the
ServletRequest parameters, but on the properties already set on the Action
- or in my case the model bean. So moving the interceptor up the stack
would just break validation.
>From the com.opensymphony.xwork2.validator.ValidationInterceptor javadoc:
* This interceptor runs the action through the standard validation
framework, which in turn checks the action against
* any validation rules (found in files such as
<i>ActionClass-validation.xml</i>) and adds field-level and action-level
* error messages (provided that the action implements [EMAIL PROTECTED]
com.opensymphony.xwork2.ValidationAware}). This interceptor
* is often one of the last (or second to last) interceptors applied in a
stack, as it assumes that all values have
* already been set on the action.
Thanks,
Jon French
Programmer
ASRC Management Services
ECOS Development Team
[EMAIL PROTECTED]
970-226-9290
Fort Collins Science Center
US Geological Survey
2150 Centre Ave, Building C
Fort Collins, CO 80526-8116
Dave Newton <[EMAIL PROTECTED]>
10/01/2007 04:42 PM
Please respond to
"Struts Users Mailing List" <[email protected]>
To
Struts Users Mailing List <[email protected]>
cc
Subject
Re: ModelDriven CRUD validation failure still causes JPA update
--- [EMAIL PROTECTED] wrote:
> That's an interesting idea Dave. I'm using the
> paramsPrepareStack. It'll take some investigation to
> see if that would fix the issue.
Shouldn't take much; it might be as simple as adding a
validate/defaultWorkFlow up towards the top (although
I might try just adding new ones rather than removing
the existing ones).
> Fort Collins Science Center
> US Geological Survey
> 2150 Centre Ave, Building C
I used to live up Poudre River Canyon (Poudre Park); I
sure miss the climbing out there :(
d.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]