Исключение Hibernate: сеанс Hibernate не привязан к потоку

Я пытаюсь использовать Hibernate, когда пытаюсь открыть сеанс, я получаю следующее исключение

org.springframework.web.util.NestedServletException: Request processing failed; nested 
exception is org.hibernate.HibernateException: No Hibernate Session bound to thread,        
and configuration does not allow creation of non-transactional one here
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:656)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368)
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169)
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
    com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)

root cause

org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
    org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63)
    org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:622)
    com.dataart.masternoy.dao.imp.UserDAOImpl.existUserByLoginEmail(UserDAOImpl.java:35)
    com.dataart.masternoy.service.imp.UserServiceImpl.existUserByLoginMail(UserServiceImpl.java:47)
    com.dataart.masternoy.controller.FirstPageController.isValid(FirstPageController.java:46)
    com.dataart.masternoy.controller.FirstPageController.ConfirmRegister(FirstPageController.java:79)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368)
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169)
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
    com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)

вот мой конфиг

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop"        xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd"        
    default-lazy-init="true">
    <import resource="applicationContext-services.xml" />
    <import resource="applicationContext-security.xml" />
    <import resource="applicationContext-email.xml" />
    <import resource="applicationContext-social.xml" />

    <mvc:resources mapping="/resources/**" location="/resources/" />

    <mvc:annotation-driven />
    <context:component-scan base-package="com.company.name." />
    <bean id="validator"
      class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />

    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="prefix" value="/pages/" />
      <property name="suffix" value=".jsp" />
      <property name="contentType" value="text/html; charset=UTF-8" />
    </bean>

    <bean id="messageSource"
          class="org.springframework.context.support.ResourceBundleMessageSource">
      <property name="basename" value="messages" />
      <property name="useCodeAsDefaultMessage" value="true" />
    </bean>

    <bean id="jacksonMessageConverter"
          class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
    </bean>
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
      <property name="messageConverters">
      <list>
        <ref bean="jacksonMessageConverter" />
      </list>
      </property>
    </bean>
</beans>

Диспетчерский сервлет

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">

    <mvc:annotation-driven />
    <context:component-scan base-package="com.company.name" />
    <mvc:resources mapping="/resources/**" location="/resources/" />
    <!-- 
     <mvc:view-controller path="/error/" view-name="errors/error" /> 
     <mvc:view-controller path="/403/" view-name="errors/403" /> 
     <mvc:view-controller path="/404/" view-name="errors/404" /> 
     <mvc:view-controller path="/405/" view-name="errors/405" /> 
    -->
</beans>

Услуги

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"
    default-lazy-init="true">

    <!-- <tx:annotation-driven transaction-manager="txManager" /> -->
    <tx:annotation-driven transaction-manager="transactionManager" />
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
      <property name="sessionFactory" ref="sessionFactory" />
    </bean> 
    <bean id="configProperties" class="com.dataart.masternoy.utils.PropertiesUtil">
      <property name="ignoreUnresolvablePlaceholders" value="true" />
      <property name="locations">
        <list>
          <value>classpath:/config.properties</value>
          <value>classpath:/jdbc.properties</value>
        </list>
      </property>
    </bean>

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="com.mysql.jdbc.Driver" />
      <property name="url" value="jdbc:mysql://localhost:3306/shop" />
      <property name="username" value="root" />
      <property name="password" value="root" />
    </bean>
    <bean id="dataSourceNew"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">

        <!-- <property name="driverClassName" value="org.hsqldb.jdbcDriver" /> -->
        <property name="url" value="jdbc:mysql://localhost:3306/shop" />
        <property name="username" value="root" />
        <property name="password" value="root" />

    </bean>
    <bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
        <constructor-arg ref="dataSource" />
    </bean>

    <bean id="txManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <bean id="sessionFactory"
          class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
          lazy-init="true">
      <property name="dataSource" ref="dataSourceNew" />
      <property name="packagesToScan" value="com.company.name" />
      <property name="configLocation">
        <value>classpath:hibernateConfig.xml</value>
      </property>
      <property name="configurationClass">
        <value>org.hibernate.cfg.AnnotationConfiguration</value>
      </property>
      <property name="hibernateProperties">
        <props>
          <prop key="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</prop>
          <prop key="hibernate.show_sql">true</prop>
          <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
          <prop key="hibernate.connection.charSet">UTF-8</prop>
          <prop key="current_session_context_class">thread</prop>
          <prop key="format_sql">true</prop>
        </props>
      </property>
    </bean>
</beans>

И сервисИмпл

@Service(value = "userService")
public class UserServiceImpl implements UserService {
@Autowired
@Qualifier("UserDAO")
UserDAO userDAO;

@Transactional
public void addNewUser(User user) {
    userDAO.insertNewUser(user);
}
@Transactional(readOnly = true)
public User getUserByLogin(String login) {
    return userDAO.selectUserByLogin(login);
}
@Transactional(readOnly = true)
public List<User> getUserList() {
    return userDAO.getUserList();
}
@Transactional
public void removeUserByLogin(String login) {
    userDAO.deleteUserByLogin(login);
}
@Transactional(readOnly = true)
public Boolean existUserByLoginMail(String login, String email) {
    return userDAO.existUserByLoginEmail(login, email);
}
@Transactional(readOnly = true)
public User getUserByID(Long ID) {
    return (User) userDAO.selectUserByID(ID);
}
@Transactional(readOnly = true)
public User getUserByLoginPass(String login, String pass) {
    return userDAO.getUserByLoginPass(login, pass);
}
}

person Igor Masternoy    schedule 05.06.2012    source источник
comment
возможный дубликат Hibernate @Transactional Sessions. Вы получили ответ на другой идентичный вопрос, который вы задали, и вы даже приняли ответ. Зачем ты еще раз переспрашиваешь?   -  person JB Nizet    schedule 05.06.2012
comment
Нет, это не та же проблема. Теперь он развертывается, но не может открыть сеанс.   -  person Igor Masternoy    schedule 05.06.2012


Ответы (1)


Вот мое предположение. В приложении Spring MVC контекст, используемый сервлетом-диспетчером, является дочерним элементом глобального контекста. Таким образом, если вы сконфигурируете те же bean-компоненты в этом дочернем контексте, что и те, которые настроены в глобальном контексте, дочерние контекстные bean-компоненты будут переопределять глобальные.

Это, вероятно, то, что вы сделали, что означает, что вы получаете ссылку на UserService, созданный дочерним контекстом, где нет диспетчера транзакций, вместо получения ссылки на UserService, созданный глобальным контекстом, где определен диспетчер транзакций. .

Убедитесь, что вы сканируете bean-компоненты, связанные с MVC, только в контексте MVC, изменив

<context:component-scan base-package="com.company.name" />

to

<context:component-scan base-package="com.company.name.web" />

or to

<context:component-scan base-package="com.company.name">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

Например.

person JB Nizet    schedule 05.06.2012
comment
Какой пакет com.company.name.web? - person Igor Masternoy; 05.06.2012
comment
Вымышленный пакет, в котором у вас есть все, что связано с MVC, и нет ваших сервисов и DAO. Если перечитать трассировку стека, это может быть com.company.name.controller. - person JB Nizet; 05.06.2012
comment
Если я изменю контекст: сканирование компонентов в appContext на что-нибудь еще, например com.company.name.controller. он даже не компилируется. - person Igor Masternoy; 05.06.2012
comment
Ух ты!!! Оно работает!!! Я удаляю mvc: аннотацию, управляемую в диспетчере-сервлете. И он создает сеанс и сохраняет объект в БД. ОМФГ. - person Igor Masternoy; 05.06.2012