web-dev-qa-db-fra.com

org.hibernate.HibernateException: aucune session trouvée pour le thread actuel

Je reçois l'exception ci-dessus avec Spring3 et Hibernte4

Ce qui suit est mon fichier XML bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:tx="http://www.springframework.org/schema/tx"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   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/tx
    http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

   <context:annotation-config/>


   <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/GHS"/>
      <property name="username" value="root"/>
      <property name="password" value="newpwd"/>
  </bean>

  <bean id="sessionFactory"
      class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="hibernateProperties">
        <props>
            <prop key="dialect">org.hibernate.dialect.MySQL5Dialect</prop>
        </props>
    </property>
    <property name="packagesToScan">
        <list>
            <value>com.example.ghs.model.timetable</value>
        </list>
    </property>
  </bean>

   <bean id="baseDAO"
      class="com.example.ghs.dao.BaseDAOImpl"/>
</beans>

Ma classe BaseDAO ressemble à ceci

public class BaseDAOImpl implements BaseDAO{
private SessionFactory sessionFactory;

 @Autowired
 public BaseDAOImpl(SessionFactory sessionFactory){
     this.sessionFactory = sessionFactory;
 }

 @Override
 public Session getCurrentSession(){
     return sessionFactory.getCurrentSession();
 }
}

Le code suivant lève l'exception dans le titre

public class Main {
 public static void main(String[] args){
    ClassPathXmlApplicationContext context =
            new ClassPathXmlApplicationContext("dao-beans.xml");
    BaseDAO bd = (BaseDAO) context.getBean("baseDAO");
    bd.getCurrentSession();
 }
}

Quelqu'un at-il une idée de la façon de résoudre ce problème?

33
Can't Tell

getCurrentSession() n'a de sens que dans une portée de transaction.

Vous devez déclarer un gestionnaire de transactions approprié, délimiter les limites des transactions et effectuer un accès aux données à l'intérieur. Par exemple, comme suit:

<bean id = "transactionManager" class = "org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name = "sessionFactory" ref = "sessionFactory" />
</bean>

.

PlatformTransactionManager ptm = context.getBean(PlatformTransactionManager.class);
TransactionTemplate tx = new TransactionTemplate(ptm);

tx.execute(new TransactionCallbackWithoutResult() {
    public void doInTransactionWithoutResult(TransactionStatus status) { 
        // Perform data access here
    }
});

Voir aussi:

45
axtavt

Je suis tombé sur le même problème et j'ai résolu comme ci-dessous Ajout de @Transactional sur la classe daoImpl

Gestionnaire de trnsaction ajouté dans le fichier de configuration:

<tx:annotation-driven/> 

<bean id="transactionManager" 
 class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
25
Vishal Jagtap

Je vais juste ajouter quelque chose qui m'a mis du temps à déboguer: n'oubliez pas qu'une annotation @Transactional ne fonctionnera que sur les méthodes "publiques".

J'ai mis des @Transactional sur ceux "protégés" et j'ai eu cette erreur.

J'espère que ça aide :)

http://docs.spring.io/spring/docs/3.1.0.M2/spring-framework-reference/html/transaction.html

Visibilité de la méthode et @Transactional

Lorsque vous utilisez des proxys, vous devez appliquer l'annotation @Transactional uniquement aux méthodes ayant une visibilité publique. Si vous annotez des méthodes protégées, privées ou visibles par package avec l'annotation @Transactional, aucune erreur n'est déclenchée, mais la méthode annotée ne présente pas les paramètres transactionnels configurés. Envisagez l'utilisation d'AspectJ (voir ci-dessous) si vous devez annoter des méthodes non publiques.

6
lboix