i trying update application use session-per-request pattern can move newer gwt versions (my entities don't save correctly past 2.4 - gwt >2.4 requestfactory not saving child object changes
i have implemented request filter, , appeared working correctly - can pull data down client no problem. however, when try save entity, errors out because not find active transaction:
org.hibernate.hibernateexception: saveorupdate not valid without active transaction
i pulled of info on how implement pattern https://developer.jboss.org/wiki/opensessioninview . here's filter:
public class hibernatesessionrequestfilter implements filter { private static log log = logfactory.getlog(hibernatesessionrequestfilter.class); private sessionfactory sf; public void dofilter(servletrequest request, servletresponse response, filterchain chain) throws ioexception, servletexception { try { system.out.println("starting database transaction"); sf.getcurrentsession().begintransaction(); // call next filter (continue request processing) chain.dofilter(request, response); // commit , cleanup system.out.println("committing database transaction"); sf.getcurrentsession().gettransaction().commit(); } catch (staleobjectstateexception staleex) { log.error("this interceptor not implement optimistic concurrency control!"); log.error("your application not work until add compensation actions!"); // rollback, close everything, possibly compensate permanent changes // during conversation, , restart business conversation. maybe // give user of application chance merge of work // fresh data... here depends on applications design. throw staleex; } catch (throwable ex) { // rollback ex.printstacktrace(); try { if (sf.getcurrentsession().gettransaction().isactive()) { system.out.println("trying rollback database transaction after exception"); sf.getcurrentsession().gettransaction().rollback(); } } catch (throwable rbex) { log.error("could not rollback transaction after exception!", rbex); } // let others handle it... maybe interceptor exceptions? throw new servletexception(ex); } } public void init(filterconfig filterconfig) throws servletexception { system.out.println("initializing filter..."); system.out.println("obtaining sessionfactory static hibernateutil singleton"); sf = hibernateutil.getsessionfactory(); } public void destroy() {} }
my web.xml:
<servlet> <servlet-name>requestfactoryservlet</servlet-name> <servlet-class>com.example.server.util.examplerequestfactoryservlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>requestfactoryservlet</servlet-name> <url-pattern>/gwtrequest</url-pattern> </servlet-mapping> <filter> <filter-name>hibernatefilter</filter-name> <filter-class>com.example.server.util.hibernatesessionrequestfilter</filter-class> </filter> <filter-mapping> <filter-name>hibernatefilter</filter-name> <url-pattern>/gwtrequest</url-pattern> </filter-mapping>
a save straightforward:
// client private void savescale(scaleproxy scale) { scalerequest.save(scale) .fire(new receiver<void>() { @override public void onsuccess(void response) { window.alert("scale saved."); } }); } // server public static void save(scale scale) { session session = hibernateutil.getsessionfactory().getcurrentsession(); session.saveorupdate(scale); }
any other info can provide? appreciate ideas or insight!
you need 1 session per request, not 1 single transaction. open , close transactions in each service method, proper behavior in case if error.
Comments
Post a Comment