I have a "No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here" exception only when I try to perform a not read-only transaction.
The application consists of 2 Liferay portlets, one for the administration of surveys (igiSurvey), one to take a survey (igiTakeSurvey). I use annotations.
Stacktrace
My configurationCode:DEBUG [http-8080-1] (OpenSessionInViewInterceptor.java:154) - Opening single Hibernate Session in OpenSessionInViewInterceptor DEBUG [http-8080-1] (SessionFactoryUtils.java:316) - Opening Hibernate Session DEBUG [http-8080-1] (SessionImpl.java:220) - opened session at timestamp: 13105723712 DEBUG [http-8080-1] (DispatcherPortlet.java:723) - Render phase found exception caught during action phase - rethrowing it DEBUG [http-8080-1] (OpenSessionInViewInterceptor.java:212) - Closing single Hibernate Session in OpenSessionInViewInterceptor DEBUG [http-8080-1] (SessionFactoryUtils.java:789) - Closing Hibernate Session ERROR [http-8080-1] (FrameworkPortlet.java:559) - Could not complete request org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here at org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63) at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:542) at it.infn.grid.liferay.survey.modules.core.dao.impl.GenericDaoHibernate.findById(GenericDaoHibernate.java:179) at it.infn.grid.liferay.survey.modules.survey.service.impl.SurveyServiceImpl.findById(SurveyServiceImpl.java:127) at it.infn.grid.liferay.survey.modules.survey.controller.EditSurveyController.getCommandObject(EditSurveyController.java:104) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:162) at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:358) at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter.doHandle(AnnotationMethodHandlerAdapter.java:345) at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter.handleAction(AnnotationMethodHandlerAdapter.java:280) at org.springframework.web.portlet.DispatcherPortlet.doActionService(DispatcherPortlet.java:641) at org.springframework.web.portlet.FrameworkPortlet.processRequest(FrameworkPortlet.java:519) at org.springframework.web.portlet.FrameworkPortlet.processAction(FrameworkPortlet.java:460) at com.liferay.portlet.FilterChainImpl.doFilter(FilterChainImpl.java:70) at com.liferay.portal.kernel.portlet.PortletFilterUtil.doFilter(PortletFilterUtil.java:48)
web.xml (selected fragments)
applicationContext.xml (fragmentsCode:<context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/applicationContext.xml </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>ViewRendererServlet</servlet-name> <servlet-class>org.springframework.web.servlet.ViewRendererServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ViewRendererServlet</servlet-name> <url-pattern>/WEB-INF/servlet/view</url-pattern> </servlet-mapping>
igiSurvey-portlet.xml (fragments)Code:<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> ${hibernate.current_session_context_class}</prop>--> <prop key="hibernate.cache.provider_class">${hibernate.cache.provider_class}</prop> </props> </property> <property name="annotatedClasses"> <list> ... (model classes) </list> </property> </bean> <bean name="openSessionInViewInterceptor" class="org.springframework.web.portlet.handler.WebRequestHandlerInterceptorAdapter"> <constructor-arg> <bean class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"> <property name="sessionFactory" ref="sessionFactory"/> </bean> </constructor-arg> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <tx:annotation-driven transaction-manager="transactionManager" />
Same content for igiTakeSurvey-portlet.xmlCode:<context:component-scan base-package="it.infn.grid.liferay.survey.modules.survey" /> <context:component-scan base-package="it.infn.grid.liferay.survey.modules" > <context:include-filter type="regex" expression="it.infn.grid.liferay.survey.modules.takesurvey.*Service.*" /> </context:component-scan> <!-- It allows us to use @Autowire, @Required and @Qualifier annotations. --> <context:annotation-config /> <bean id="annotationMapper" class="org.springframework.web.portlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="order" value="10" /> <property name="interceptors"> <list> <ref bean="openSessionInViewInterceptor"/> </list> </property> </bean>
I have a GenericDaoHibernate implementing GenericDao which is annotated with @Transactional
but all the other transaction annotations are in the service layer:Code:@Transactional(readOnly = true) public T findById(final ID id, final boolean lock) throws DataAccessException {
DAOs:Code:@Service(value="surveyService") public class SurveyServiceImpl implements SurveyService { @Transactional(readOnly = true) public Survey findById(Long id) { .... } @Transactional(readOnly = false) public Survey save(Survey survey) { .... }
Everything was working before I switched to annotating the transactions.Code:@Repository("surveyDao") public class SurveyDaoHibernate extends GenericDaoHibernate<Survey, Long> implements SurveyDao { @Autowired public SurveyDaoHibernate(SessionFactory factory) { super(factory); } .... }
I read a lot of threads about this exception but no solution has worked for me.
Thank you!


Reply With Quote
