gwt - Requestfactory hibernate session-per-request -


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