2012-05-05 13 views
32

Me estoy poniendo la excepción anterior con Spring3 y Hibernte4org.hibernate.HibernateException: No se encontró Sesión de hilo actual

La siguiente es mi archivo XML frijol

<?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> 

Mi clase BaseDAO tiene este aspecto

public class BaseDAOImpl implements BaseDAO{ 
private SessionFactory sessionFactory; 

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

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

el siguiente código produce la excepción en el título

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

¿Alguien tiene una idea sobre cómo resolver este problema?

Respuesta

43

getCurrentSession() solo tiene sentido dentro del alcance de la transacción.

Debe declarar un administrador de transacciones apropiado, delimitar los límites de las transacciones y realizar el acceso a los datos dentro de él. Por ejemplo, de la siguiente manera:

<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 
    } 
}); 

Ver también:

+0

Gracias por la respuesta. Veré los recursos que ha vinculado anteriormente. –

+4

'' también debe incluirse como lo menciona [@ vishal-jagtap] (http://stackoverflow.com/questions/10459922/org-hibernate-hibernateexception-no-session-found-for -current-thread/# 16296691) –

+0

Muchas gracias, esto realmente me ayudó a seguir adelante. –

-1

En qué paquete has puesto la clase BaseDAOImpl ... Creo que requiere un nombre de paquete similar al que has utilizado en el contexto de aplicación xml y también requiere una anotación relevante.

24

me encontré con el mismo problema y se resolvió de la siguiente manera Agregado @Transactional en DAOImpl clase

Agregado gerente trnsaction en el archivo de configuración:

<tx:annotation-driven/> 

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

Esto funcionó bien para mí. Me salvó el día. : D – wsams

+0

gracias ... esto funcionó tan bien conmigo ... –

5

voy a añadir algo que me tomó un tiempo para depurar: no hay que olvidar que una anotación de @Transactional sólo funcionará en los métodos de "públicos".

Puse algunos @Transactional en los "protegidos" y obtuve este error.

espero que ayude :)

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

visibilidad Método y @Transactional

Al utilizar servidores proxy, debe solicitar la anotación @Transactional sólo para métodos con visibilidad pública. Si anota protegidos, métodos privados o visibles con el paquete con la anotación @Transactional, , no se produce ningún error, pero el método anotado no muestra la configuración transaccional configurada . Considere el uso de AspectJ (consulte a continuación) si necesita anotar métodos no públicos.

Cuestiones relacionadas