Just a thought, are you actually using transactions? If so why not modify the interceptor to only commit if a SUCCESS is returned or perform a rollback if ERROR is returned from the action invocation.
Al. -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Sent: 02 October 2007 04:04 To: Struts Users Mailing List Subject: Re: ModelDriven CRUD validation failure still causes JPA update - RESOLVED 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" <user@struts.apache.org> To "Struts Users Mailing List" <user@struts.apache.org> 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" <user@struts.apache.org> To Struts Users Mailing List <user@struts.apache.org> 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] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]