IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

Hibernate 4 : org.hibernate.HibernateException: No Session found for current thread


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 6
    Par défaut Hibernate 4 : org.hibernate.HibernateException: No Session found for current thread
    Bonjour,

    J'essaye d'utiliser Hibernate version 4.3.11.Final et spring version 4.2.2.RELEASE mais quand je récupère la session dans ma classe UserDao j'ai une exception : "No Session found for current thread".
    Je ne comprends pas pourquoi je pense avoir rien oublié...

    Ci-dessous mes sources XML et java.

    Merci d'avance pour votre aide.

    web.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    <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>
    root-context.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    <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"/>
    servlet-context.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    <!-- 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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    package com.rg.flosite.dao;
     
    import com.rg.flosite.model.User;
     
    public interface UserDAO {
        public void updateUser(User user);
        public User getUser();
    }
    UserDAOImpl.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    package com.rg.flosite.service;
     
    import com.rg.flosite.model.User;
     
    public interface UserService {
        public User getUser();
        public void updateUser(User user);
     
    }
    UserServiceImpl.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    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";
        }
     
    }

  2. #2
    Membre chevronné Avatar de freddou17
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 341
    Par défaut
    Slt,
    le package scanné par spring n'est-il pas trop restrictif?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <context:component-scan base-package="com.rg.flosite.controller" />
    peut être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <context:component-scan base-package="com.rg.flosite" />
    bon courage
    ++

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 6
    Par défaut
    Salut,

    Merci pour ton retour. J'ai essayé mais j'ai toujours la même erreur .

    Merci d'avance pour ton aide

  4. #4
    Membre chevronné Avatar de freddou17
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 341
    Par défaut
    et root context.xml à quel moment est-il rattaché au context spring?

    edit: répondu trop vite

    Vu que tu utilises les annotation ta session factory devrait-être de type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AnnotationSessionFactoryBean
    ++

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 6
    Par défaut
    Je suis hibernate V4 je crois que le AnnotationSessionFactoryBean est remplacé par LocalSessionFactoryBean non?
    Tu veux que je change la version en hibernate V3 ?

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    c'est vos component-scan et la répartition des beans dans vos contextes qui sont erronés :
    1. vos packages domain/dao/repository/business logic doivent être scannés par le contexte "application" : votre root-context.xml
    ils seront annotés reps. @Entity/@Repository+@Transactional/@Service
    2. vos packages MVC controller doivent être scannés par le contexte "servlet"
    ils seront annotés @Controller|@RestController et pas @Service
    3. il est impératif qu'il n'y ait pas d'intersection de package entre les scans

    Votre annotation @Transactional sur votre service est scannée dans le servlet context pas dans le context "application" c'est ce qui provoque l'exception
    et vos beans dao/business logic n'ont rien à faire dans ce contexte non plus.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Integration] Problème "No Session found for current thread"
    Par jerome5869 dans le forum Spring
    Réponses: 2
    Dernier message: 02/01/2017, 21h10
  2. Réponses: 2
    Dernier message: 17/02/2012, 14h11
  3. Réponses: 4
    Dernier message: 21/04/2011, 17h24
  4. Réponses: 5
    Dernier message: 29/09/2009, 18h56
  5. Réponses: 1
    Dernier message: 03/07/2007, 14h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo