java - Could not retrieve pre-bound Hibernate session - Could not obtain transaction-synchronized Session for current thread -


i creating web application spring-mvc, spring-security, spring-core, , hibernate.

but non-error hibernate session factory.

it throwing hibernateexception, see on log in debug level, , application continues execution no problem.

but curious understand reason of exception raised.

the log shows following lines.

2016-08-29 13:34:55,310 debug [sg.com.diamond.express.base.dao.impl.hibernatedaoimpl].[doexecute]([328]) [http-nio-8888-exec-4] - not retrieve pre-bound hibernate session org.hibernate.hibernateexception: not obtain transaction-synchronized session current thread     @ org.springframework.orm.hibernate4.springsessioncontext.currentsession(springsessioncontext.java:134)     @ org.hibernate.internal.sessionfactoryimpl.getcurrentsession(sessionfactoryimpl.java:1014)     @ org.springframework.orm.hibernate4.hibernatetemplate.doexecute(hibernatetemplate.java:325)     @ org.springframework.orm.hibernate4.hibernatetemplate.executewithnativesession(hibernatetemplate.java:308)     @ org.springframework.orm.hibernate4.hibernatetemplate.get(hibernatetemplate.java:418)     @ org.springframework.orm.hibernate4.hibernatetemplate.get(hibernatetemplate.java:411)     @ sg.com.diamond.express.base.dao.impl.basehibernatedaoimpl.findbyid(basehibernatedaoimpl.java:160)     @ sg.com.diamond.express.webadmin.service.impl.clientprofileserviceimpl.searchbyname(clientprofileserviceimpl.java:48)     @ sg.com.diamond.express.webadmin.controller.impl.clientcontroller.home(clientcontroller.java:48)     @ sun.reflect.nativemethodaccessorimpl.invoke0(native method)     @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:62)     @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43)     @ java.lang.reflect.method.invoke(method.java:497)     @ org.springframework.web.servlet.mvc.multiaction.multiactioncontroller.invokenamedmethod(multiactioncontroller.java:472)     @ org.springframework.web.servlet.mvc.multiaction.multiactioncontroller.handlerequestinternal(multiactioncontroller.java:409)     @ org.springframework.web.servlet.mvc.abstractcontroller.handlerequest(abstractcontroller.java:146)     @ org.springframework.web.servlet.mvc.simplecontrollerhandleradapter.handle(simplecontrollerhandleradapter.java:50)     @ org.springframework.web.servlet.dispatcherservlet.dodispatch(dispatcherservlet.java:943)     @ org.springframework.web.servlet.dispatcherservlet.doservice(dispatcherservlet.java:877)     @ org.springframework.web.servlet.frameworkservlet.processrequest(frameworkservlet.java:966)     @ org.springframework.web.servlet.frameworkservlet.doget(frameworkservlet.java:857)     @ javax.servlet.http.httpservlet.service(httpservlet.java:622)     @ org.springframework.web.servlet.frameworkservlet.service(frameworkservlet.java:842)     @ javax.servlet.http.httpservlet.service(httpservlet.java:729) 

this code have.

dao level

this abstraction level created minimise number of boiler-plate codes dao, no need implement basic c-r-u-d.

basedao interface

public interface basedao <id extends serializable, m extends basemodel> {     session getcurrentsession();      m findbyid(id id) throws daoexception;     list<m> findbycriteria(m criteria) throws daoexception;     list<m> listall() throws daoexception;     id saveobject(m object) throws daoexception;     void saveorupdate(m object) throws daoexception;     query createquery(string hql) throws daoexception;     query createsqlquery(string sql) throws daoexception;     criteria createcriteria(class clazz) throws daoexception;     list<m> runquery(query query) throws daoexception;     list<m> runquery(string sql) throws daoexception; } 

basedao implementation

public class basehibernatedaoimpl<id extends serializable, m extends basemodel> extends hibernatetemplate implements basedao<id, m> {      protected class<m> modelclass;      @override     public session getcurrentsession() {         return this.getsessionfactory().getcurrentsession();     }      public id saveobject(m object) throws daoexception {         try {             object.setcreator("batch");             object.setcreatedat(new timestamp(new date().gettime()));             object.setupdater("batch");             object.setupdatedat(new timestamp(new date().gettime()));             return (id) super.save(object);         } catch (exception e) {             logger.error(exceptionutil.getstacktraces(e), e);             throw new daoexception(e);         }     }      /** other implementation methods **/ 

spring xml configuration

    <!--|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~         | data source configuration         |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  -->     <bean id="targetdatasource" class="org.springframework.jdbc.datasource.drivermanagerdatasource">         <property name="driverclassname" value="oracle.jdbc.driver.oracledriver" />         <property name="url" value="jdbc:oracle:thin:@192.168.170.36:1521:expt2" />         <property name="username" value="exp_user" />         <property name="password" value="passw0rd" />     </bean>     <bean id="datasource" class="org.springframework.jdbc.datasource.transactionawaredatasourceproxy">         <property name="targetdatasource" ref="targetdatasource"/>     </bean>      <!--|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~         | hibernate abstract session factory parent         |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  -->     <bean id="basesessionfactory" class="org.springframework.orm.hibernate4.localsessionfactorybean" abstract="true">         <property name="hibernateproperties">             <props>                 <prop key="hibernate.show_sql">true</prop>                 <prop key="hibernate.format_sql">true</prop>                 <prop key="hibernate.jdbc.batch_size">10</prop>             </props>         </property>     </bean>      <!--|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~         | hibernate entity configurations         |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  -->     <bean id="expresssessionfactory" class="org.springframework.orm.hibernate4.localsessionfactorybean" parent="basesessionfactory">         <property name="hibernateproperties">             <props merge="true">                 <prop key="hibernate.dialect">org.hibernate.dialect.oracle10gdialect</prop>             </props>         </property>         <property name="datasource" ref="datasource"/>         <property name="mappinglocations" value="classpath*:hbm/express/*.hbm.xml"/>     </bean>      <!--|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~         | transaction management         |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  -->     <bean id="txmanager" class="org.springframework.orm.hibernate4.hibernatetransactionmanager">         <property name="sessionfactory" ref="expresssessionfactory"/>     </bean>      <aop:config>         <aop:pointcut id="servicepointcut" expression="execution(* sg.com.diamond.express.webadmin.service.*.*.*(..))"/>         <aop:advisor id="servicetx" advice-ref="txadvice" pointcut-ref="servicepointcut"/>     </aop:config>      <tx:advice id="txadvice" transaction-manager="txmanager">         <tx:attributes>             <tx:method name="get*"      propagation="requires_new" isolation="read_committed" read-only="true" />             <tx:method name="search*"   propagation="requires_new" isolation="read_committed" read-only="true" />             <tx:method name="list*"     propagation="requires_new" isolation="read_committed" read-only="true" />             <tx:method name="is*"       propagation="requires_new" isolation="read_committed" read-only="true" />             <tx:method name="*"         propagation="requires_new" isolation="read_committed" read-only="false"/>         </tx:attributes>     </tx:advice>      <!--|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~         | base dao definitions         |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  -->     <bean id="baseexpressdao" class="sg.com.diamond.express.base.dao.impl.basehibernatedaoimpl" abstract="true">         <property name="sessionfactory" ref="expresssessionfactory"/>     </bean> 

question

why error happen? , doesn't break app, log level debug, not error, app able continue after that.

is configuration correct?

note

don't mind full-xml config, reason, need use full-xml , none-annotations.

answer

after mucking around aop pointcut expression, noticed on simple batch program wrote, have 1 context, not have problem.

this leads me answer.

i structured spring xml config multiple layers.

  • at top level, @ application context, declare data sources, , transaction managements.
  • at second level, servlet level, each servlet has own context. @ level, put controller-service-dao configurations.
  • there should multiple of "second-level" context, example, 1 servlet context should handle restful services, 1 handles web-ui.

i've structured assuming take on transaction management setup in application context. sort of "all servlet context should able use same data-source , transaction-management same way"

but turns out, doesn't.

when moved transaction management piece, including data-source config, servlet context configuration, works fine, , service wrapped correctly under transaction.

thanks.

the error happens because aop transaction configuration not correct. not cover service class stack trace. tweak mapping until stop getting stack trace. or maybe better use annotated transaction configuration if possible. answer second question in sources of hibernate template:

try { 325         session =     getsessionfactory().getcurrentsession(); 326         } 327         catch (hibernateexception ex) { 328             logger.debug("could not retrieve pre-bound hibernate session", ex); 329         } 330         if (session == null) { 331             session = getsessionfactory().opensession(); 332             session.setflushmode(flushmode.manual); 333             isnew = true; 334         } 

Comments

Popular posts from this blog

amazon web services - S3 Pre-signed POST validate file type? -

c# - Check Keyboard Input Winforms -