requestmapping - spring security tutorial
org.hibernate.HibernateException: no se ha encontrado ninguna sesión para el hilo actual (4)
Añadiré algo que me llevó algún tiempo depurar: no olvide que una anotación @Transactional solo funcionará en métodos "públicos".
Puse algunos @Transactional en los "protegidos" y obtuve este error.
Espero eso ayude :)
http://docs.spring.io/spring/docs/3.1.0.M2/spring-framework-reference/html/transaction.html
Visibilidad del método y @Transactional
Al usar proxies, debe aplicar la anotación @Transactional solo a los métodos con visibilidad pública. Si anota métodos protegidos, privados o visibles del paquete con la anotación @Transactional, no se genera ningún error, pero el método anotado no muestra la configuración transaccional configurada. Considere el uso de AspectJ (ver a continuación) si necesita anotar métodos no públicos.
Obtengo la excepción anterior con Spring3 y Hibernte4
El siguiente es mi archivo bean xml
<?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 se ve así
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 arroja 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?
En qué paquete has puesto la clase BaseDAOImpl. Creo que requiere un nombre de paquete similar al que has utilizado en el contexto xml de la aplicación y también requiere una anotación relevante.
Me encontré con el mismo problema y me solucionaron lo siguiente: Agregué @Transactional en la clase daoImpl
Administrador de trnsaction agregado 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>
getCurrentSession()
solo tiene sentido dentro de un alcance de 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: