valid tutorial requestmapping mvc example español ejemplo spring hibernate spring-3 hibernate-4.x

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: