Another reason OSiV filters can be tricky. Dave
On Wed, Mar 9, 2011 at 2:04 PM, CRANFORD, CHRIS <chris.cranf...@setech.com> wrote: > Francois - > > I use the standard paramsPrepareParamsStack interceptor from Struts. > > All I have done on my end is wrap this interceptor stack with a few > application specific interceptors that control things such as authentication > required, auditing, and logging. I stepped upon my issue one day when I had > returned from lunch and my session had timed out. I hit the SAVE button on a > form and it redirected me to our login page. > > But prior to logging back in; I checked the database and noticed that the > record was in fact persisted with the changes from the form. All I can > gather is the following: > > 1. Request comes in for Struts > 2. Hibernate Session opened via OSIV > 3. Model is loaded from DB via prepare() > 4. Struts copies parameters into the model > 5. Validation/Interceptors fire > 6. Authentication Interceptor detects timed out session, returns LOGIN > 7. User presented with login page > 8. OSIV filter closes, changes from #4 persisted. > > I then created a simple test action where I load a persist entity from the DB > in a ModelDriven action, I call the action passing parameters that are > properties on the entity. Then the execute() method does nothing more than > return SUCCESS which maps to my /pages/done.jsp. The changes are committed. > > I'd prefer that changes aren't committed unless I explicitly call to do so on > the EntityManager; however I understand Hibernate/JPA's reasons behind why it > works the way it does. > > > >> -----Original Message----- >> From: François Rouxel [mailto:rouxe...@yahoo.com] >> Sent: Wednesday, March 09, 2011 12:24 PM >> To: Struts Users Mailing List >> Subject: Re : Re : ModelDriven & Hibernate Entities >> >> Hi Chris, >> first, >> you might have another pb, because struts2 does not change your model >> if a >> validation failed. In may case, the model is not changed so not >> persisted. Do u >> use validation and workflow interceptor ? >> second, >> you are right about MVC pattern, but, just be aware that when you use >> OSIV >> pattern, hibernate call backend service when loading data...:-)) so >> your JSP is >> not just a view in that case.... >> >> >> I wrote my first mail thinking you wanna rollback after an exception >> occured. >> maybe it's gonna help others. >> >> fr/ >> >> >> ____________________________________________ >> ____________________________________________ >> >> >> >> ----- Message d'origine ---- >> De : "CRANFORD, CHRIS" <chris.cranf...@setech.com> >> À : Struts Users Mailing List <user@struts.apache.org> >> Envoyé le : Mer 9 mars 2011, 13h 09min 33s >> Objet : RE: Re : ModelDriven & Hibernate Entities >> >> Francois - >> >> While that may work for you, I wouldn't place anything Hibernate or >> persistence >> related in my JSP pages at all. In my mind, this breaks the entire >> reasoning >> behind MVC and the view simply there to render data. If the view is >> doing >> anything beyond that, I have a design problem, but again that's my >> opinion. >> >> But what about when you use the INPUT result code in your execute() >> method. >> >> If I return the user to the INPUT method because maybe I'm not using >> the Struts >> validation framework and doing it myself in my execute() method or I >> have some >> complex conditions I must check for before I save the data. In this >> case, by >> returning INPUT and setting some action field or error messages to be >> shown to >> the user, the error exception handler isn't fired, thus your rollback >> isn't >> fired either; leaving your entity persisted with likely dirty data. >> >> > -----Original Message----- >> > From: François Rouxel [mailto:rouxe...@yahoo.com] >> > Sent: Wednesday, March 09, 2011 11:43 AM >> > To: Struts Users Mailing List >> > Subject: Re : ModelDriven & Hibernate Entities >> > >> > same issue >> > this how I fixed it : (the main idea is to redirect to a jsp if an >> > exception >> > occured, and the jsp rollback) >> > >> > create an error page error.jsp >> > <%@page import="com.rdvcentral.util.persistance.HibernateUtil"%> >> > <%@ page contentType="text/html;charset=UTF-8" language="java" %> >> > <%@ taglib prefix="s" uri="/struts-tags" %> >> > <%@ taglib prefix="sj" uri="/struts-jquery-tags" %> >> > >> > >> > <%@page import="org.hibernate.Transaction"%> >> > <%@page import="org.apache.log4j.Logger"%> >> > >> > <s:property value="%{logError(exception)}"/> >> > <% >> > Transaction tx = new >> > >> HibernateUtil().getSessionFactory().getCurrentSession().getTransaction( >> > ); >> > if (tx != null && tx.isActive()) { >> > tx.rollback(); >> > } >> > %> >> > >> > In your struts mapping file : >> > >> > <global-results> >> > <result name="unhandledException">/error.jsp</result> >> > </result> >> > </global-results> >> > >> > <global-exception-mappings> >> > <exception-mapping exception="java.lang.Exception" >> > result="unhandledException" /> >> > </global-exception-mappings> >> > >> > hope it will help you >> > >> > >> > ____________________________________________ >> > ____________________________________________ >> > >> > >> > >> > ----- Message d'origine ---- >> > De : "CRANFORD, CHRIS" <chris.cranf...@setech.com> >> > À : Struts Users Mailing List <user@struts.apache.org> >> > Envoyé le : Mer 9 mars 2011, 12h 34min 32s >> > Objet : ModelDriven & Hibernate Entities >> > >> > I had started down a path of using the ModelDriven interface from >> > Struts >> > because I find it really helps maintain a class action class without >> > large numbers of get/set methods for screens that contain a lot of >> form >> > fields. >> > >> > However, I am finding at least with how I have attempted to approach >> > ModelDriven to have several drawbacks. For example, by using the >> OSIV >> > (Open Session In View) filter, I am finding that when Struts sets the >> > properties on the entity and afterward if an exception is thrown, >> > caught >> > and handled and doesn't trigger Hibernate to actually "rollback"; the >> > changes are persisted which leaves my entity in a dirty inconsistent >> > state. >> > >> > How have others solved this by using your entity domain POJOs in your >> > view? >> > >> > Do you use them detached from the session so that you explicitly have >> > to >> > merge them to the session to be persisted? If so, how do you deal >> with >> > multiple lazy loaded collections in your entity? >> > >> > Or would using DTO objects from my service layer a better alternative >> > to >> > insure that no data is actually persisted to the database that >> > shouldn't >> > be? >> > >> > >> > --------------------------------------------------------------------- >> > To unsubscribe, e-mail: user-unsubscr...@struts.apache.org >> > For additional commands, e-mail: user-h...@struts.apache.org >> > >> > >> > >> > >> > --------------------------------------------------------------------- >> > To unsubscribe, e-mail: user-unsubscr...@struts.apache.org >> > For additional commands, e-mail: user-h...@struts.apache.org >> > >> >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: user-unsubscr...@struts.apache.org >> For additional commands, e-mail: user-h...@struts.apache.org >> >> >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: user-unsubscr...@struts.apache.org >> For additional commands, e-mail: user-h...@struts.apache.org >> > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: user-unsubscr...@struts.apache.org > For additional commands, e-mail: user-h...@struts.apache.org > > --------------------------------------------------------------------- To unsubscribe, e-mail: user-unsubscr...@struts.apache.org For additional commands, e-mail: user-h...@struts.apache.org