2015-10-26 6 views
1

Я пытаюсь использовать версию Hibernate 4.3.11.Final и spring version 4.2.2.RELEASE. Когда я получаю сеанс в моем UserDAO, у меня есть исключение спящего режима: сеанс не найден для текущего потока. Я не понимаю, почему ты мог мне помочь?Hibernate 4: org.hibernate.HibernateException: сеанс не найден для текущей темы

Ниже Мои файлы и источники:

благодарю вас

web.xml

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/spring/root-context.xml, 
     /WEB-INF/spring-security.xml 
    </param-value> 
</context-param> 

<!-- Creates the Spring Container shared by all Servlets and Filters --> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<!-- Processes application requests --> 
<servlet> 
    <servlet-name>appServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>appServlet</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

<!-- Spring Security --> 
<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

корня context.xml

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" 
     value="jdbc:mysql://localhost:8889/flosite" /> 
    <property name="username" value="test" /> 
    <property name="password" value="" /> 
</bean> 

<!-- Hibernate Session Factory --> 


<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="myDataSource" /> 
    <property name="packagesToScan"> 
     <array> 
      <value>com.rg.flosite.model</value> 
      <value>com.rg.flosite.dao</value> 
      <value>com.rg.flosite.service</value> 
     </array> 
    </property> 
    <property name="hibernateProperties"> 
     <value> 
      hibernate.dialect=org.hibernate.dialect.MySQLDialect 
     </value> 
    </property> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="dataSource" ref="myDataSource"/> 
     <property name="sessionFactory" ref="sessionFactory"/> 
</bean> 
<tx:annotation-driven transaction-manager="transactionManager"/> 

сервлет-context.xml

<!-- Enables the Spring MVC @Controller programming model --> 
<annotation-driven /> 
<resources mapping="/resources/**" location="/resources/" /> 
<resources mapping="/webjars/**" location="classpath:/META-INF/resources/webjars/" /> 

<!-- Resolves views selected for rendering by @Controllers to .jsp resources 
    in the /WEB-INF/views directory --> 
<beans:bean 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <beans:property name="prefix" value="/WEB-INF/views/" /> 
    <beans:property name="suffix" value=".jsp" /> 
</beans:bean> 
<beans:bean id="tilesConfigurer" 
    class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"> 
    <beans:property name="definitions"> 
     <beans:list> 
      <beans:value>/WEB-INF/tiles.xml</beans:value> 
     </beans:list> 
    </beans:property> 
    <beans:property name="preparerFactoryClass" 
     value="org.springframework.web.servlet.view.tiles2.SpringBeanPreparerFactory" /> 
</beans:bean> 

<beans:bean id="userService" class="com.rg.flosite.service.UserServiceImpl"></beans:bean> 
<beans:bean id="userDao" class="com.rg.flosite.dao.UserDAOImpl"></beans:bean> 
<context:component-scan base-package="com.rg.flosite.controller" /> 

userDao.java

package com.rg.flosite.dao; 

import com.rg.flosite.model.User; 

public interface UserDAO { 
    public void updateUser(User user); 
    public User getUser(); 
} 

UserDAOImpl.java

package com.rg.flosite.dao; 

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Repository; 
import org.springframework.transaction.annotation.Transactional; 

import com.rg.flosite.model.User; 

@Repository 
public class UserDAOImpl implements UserDAO { 
    @Autowired 
    private SessionFactory sessionFactory; 

    private Session getCurrentSession() { 
     return sessionFactory.getCurrentSession(); 
    } 

    @Override 
    public void updateUser(User user) { 
     User userToUpdate = getUser(); 
     if (userToUpdate == null) { 
      user.setId((long) 1); 
      getCurrentSession().save(user); 
     } 
     else { 
      user.setId(userToUpdate.getId()); 
      getCurrentSession().update(user); 
     } 
    } 

    @Override 
    public User getUser() { 
     User user = (User) getCurrentSession().get(User.class,1); 
     return user; 
    } 

} 

UserService.java

package com.rg.flosite.service; 

import com.rg.flosite.model.User; 

public interface UserService { 
    public User getUser(); 
    public void updateUser(User user); 

} 

UserServiceImpl.java

package com.rg.flosite.service; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 

import com.rg.flosite.dao.UserDAO; 
import com.rg.flosite.model.User; 

@Service 
@Transactional 
public class UserServiceImpl implements UserService { 
    @Autowired 
    private UserDAO userDao; 

    @Override 
    public User getUser() { 
     return userDao.getUser(); 
    } 

    @Override 
    public void updateUser(User user) { 
     userDao.updateUser(user); 
    } 

} 

AdminMeControler.java

package com.rg.flosite.controller; 

import java.util.Locale; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

import com.rg.flosite.model.User; 
import com.rg.flosite.service.UserService; 

@Controller 
public class AdminMeController { 
    @Autowired 
    private UserService userService; 
    @RequestMapping(value="/admin/moi", method = RequestMethod.GET) 
    public String home(Locale locale,Model model) { 
     User user = userService.getUser(); 
     return "adminme"; 
    } 

} 
+0

Благодарим вас за ответ. Я меняю org.springframework.jdbc.datasource.DataSourceTransactionManager на org.springframework.orm.hibernate4.HibernateTransactionManager. Но у меня всегда такая же ошибка .. – user1364017

+0

Да, я добавляю это в конфигурацию TransactionManager: Я обновляю свой root-context.xml в своем первом сообщении. Спасибо за вашу помощь – user1364017

+0

У меня всегда такая же ошибка, я не понимаю, почему ... – user1364017

ответ

0

Ok я нашел раствора на другом форуме. Мои пакеты DAO, модель, служба должны быть проверены контекстом приложения (root-context.xml), а не контекстом сервлета (servlet-context.xml). Итак, я изменил код ниже из сервлета-контекста в корневой контекст.

<bean id="userService" class="com.rg.flosite.service.UserServiceImpl"></bean> 
<bean id="userDao" class="com.rg.flosite.dao.UserDAOImpl"></bean> 
<tx:annotation-driven transaction-manager="transactionManager"/> 
<context:component-scan base-package="com.rg.flosite.dao" /> 
<context:component-scan base-package="com.rg.flosite.model" /> 
<context:component-scan base-package="com.rg.flosite.service" /> 
Смежные вопросы