Spring Hibernate - No se pudo obtener la sesión sincronizada con la transacción para el hilo actual


He creado una aplicación con spring + hibernate, pero siempre obtengo este error. Esta es mi primera aplicación con hibernate, he leído algunas guías pero no puedo resolver este problema. ¿Dónde estoy haciendo mal?

Este es el código de mi solicitud

ott 05, 2014 4:03:06 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
Informazioni: Refreshing   org.springframework.context.support.ClassPathXmlApplicationContext@1eab16b: startup date  [Sun Oct 05 16:03:06 CEST 2014]; root of context hierarchy
ott 05, 2014 4:03:06 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
Informazioni: Loading XML bean definitions from class path resource [springConfig.xml]
ott 05, 2014 4:03:08 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.5.Final}
ott 05, 2014 4:03:08 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.6.Final}
ott 05, 2014 4:03:08 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
ott 05, 2014 4:03:08 PM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
ott 05, 2014 4:03:09 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
ott 05, 2014 4:03:09 PM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
ott 05, 2014 4:03:09 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Exception in thread "main" org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014)
at coreservlets.StudentDAOImpl.create(StudentDAOImpl.java:19)
at coreservlets.MainApp.main(MainApp.java:14)

Estudiante.java

package coreservlets;

public class Student {

    private Integer id;
    private String name;
    private Integer age;

    public Integer getId(){return id;}//getId

    public void setId(Integer id){this.id=id;}//setId

    public String getName(){return name;}//getName

    public void setName(String name){this.name=name;}//setName

    public Integer getAge(){return age;}//getAge

    public void setAge(Integer age){this.age=age;}//setAge

}//Student
[7] StudentDAO.java
package coreservlets;

import org.hibernate.SessionFactory;

public interface StudentDAO {

    public void setSessionFactory(SessionFactory sessionFactory);

    public void create(String name,Integer age);

}//StudentDAO

StudentDAOImpl.java

package coreservlets;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class StudentDAOImpl implements StudentDAO {

    private SessionFactory sessionFactory;

    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory){
        this.sessionFactory=sessionFactory;
    }//setSessionFactory

    public void create(String name,Integer age){
        Session session=sessionFactory.getCurrentSession();
        Student student=new Student();
        student.setName(name);
        student.setAge(age);
        session.save(student);
    }//create

}//StudentDAOImpl

MainApp.java

package coreservlets;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {

    public static void main(String[] args) {

        ApplicationContext context=new ClassPathXmlApplicationContext("springConfig.xml");

        StudentDAOImpl student=(StudentDAOImpl) context.getBean("studentDAOImpl");

        student.create("Alessandro", new Integer(33));


    }//main

}//MainApp

SpringConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">

<context:annotation-config/>

<context:component-scan base-package="coreservlets"/>

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
  <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  <property name="url" value="jdbc:mysql://localhost:3306/spring_hibernate"/>
  <property name="username" value="root"/>
  <property name="password" value="password"/>
  <property name="initialSize" value="5"/>
  <property name="maxTotal" value="10"/>
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
    <value>
            hibernate.dialect=org.hibernate.dialect.MySQLDialect
    </value>
</property>

</bean>

</beans>

Sql

create table student
(
id integer not null auto_increment,
name varchar(20) not null,
age integer not null,
primary key(id)
);
Author: BalusC, 2014-10-05

13 answers

Debe habilitar el soporte de transacciones (<tx:annotation-driven> o @EnableTransactionManagement) y declarar el transactionManager y debería funcionar a través del SessionFactory.

Debes agregar @Transactional en tu @Repository

Con @Transactional en su @Repository Spring es capaz de aplicar soporte transaccional en su repositorio.

Tu clase Student no tiene el @javax.persistencia. cómo @Entity, asumo que la configuración de asignación para esa clase se ha definido a través de XML.

 161
Author: Manuel Jordan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-04 09:30:46

He tenido el mismo problema, pero en una clase que no era parte de la capa de servicio. En mi caso, el administrador de transacciones se obtuvo simplemente del contexto mediante el método getBean(), y la clase pertenecía a la capa de vista - mi proyecto utiliza la técnica OpenSessionInView.

El método sessionFactory.getCurrentSession(), ha estado causando la misma excepción que el autor. La solución para mí era bastante simple.

Session session;

try {
    session = sessionFactory.getCurrentSession();
} catch (HibernateException e) {
    session = sessionFactory.openSession();
}

Si el método getCurrentSession() falla, el openSession() debería hacer el truco.

 27
Author: itachi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-25 12:04:18

Agregue la anotación @ Transaccional de spring en la clase service

 11
Author: Patrikoko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-16 09:49:18

@Transactional =javax.transacción.Transaccional ponerlo justo al lado @ Repositorio

 1
Author: Alter Hu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-28 08:12:30

En su xyz.DAOImpl.java

Haga los siguientes pasos:

/ / Step-1: Set session factory

@Resource(name="sessionFactory")
private SessionFactory sessionFactory;

public void setSessionFactory(SessionFactory sf)
{
    this.sessionFactory = sf;
}

//Paso-2: Intenta obtener la sesión actual y captura la excepción HibernateException.


//Paso-3: Si hay alguna excepción de HibernateException, entonces true para obtener openSession.

try 
{
    //Step-2: Implementation
    session = sessionFactory.getCurrentSession();
} 
catch (HibernateException e) 
{
    //Step-3: Implementation
    session = sessionFactory.openSession();
}
 1
Author: ArunDhwaj IIITH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-18 13:52:51

He añadido esta configuración en web.xml y funciona bien para mí!

<filter>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
    <init-param>
        <param-name>sessionFactoryBeanName</param-name>
        <param-value>sessionFactory</param-value>
    </init-param>
    <init-param>
        <param-name>flushMode</param-name>
        <param-value>AUTO</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Además, la respuesta más clasificada me da pistas para evitar que la aplicación entre en pánico en la primera carrera.

 1
Author: 何德福,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-25 03:46:46

También tuve este error porque en el archivo donde usé la anotación @Transactional, estaba importando la clase incorrecta

import javax.transaction.Transactional; 

En lugar de javax, use

import org.springframework.transaction.annotation.Transactional; 
 1
Author: browndoor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-23 23:27:20

Encontré el mismo problema y finalmente descubrí que no estaba definido dentro del [dispatcher]-servlet.xml donde el elemento component-scan está habilitado @service annotated class.

Simplemente con el elemento component-scan junto, el problema desapareció.

 0
Author: Lee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-20 01:41:34

Mi problema similar se solucionó con menos de 2 enfoques.

  1. Mediante el manejo manual de transacciones.

    Session session = SessionFactory.getCurrentSession ();

    Transacción tx = sesión.beginTransaction ();

    UserInfo user = (userInfo) sesión.get (userInfo.clase, 1);

    Tx.commit ();

  2. Dile a Spring que abra y administre transacciones por ti en tu web.filtros xml y Asegúrese de utilizar @Repository @ Transactional

    HibernateFilter org.springframework.or.hibernate5.apoyo.OpenSessionInViewFilter SessionFactory sesión.fábrica hibernateFilter / *

Lo siento por formato incorrecto.

 0
Author: Jajikanth pydimarla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-14 06:02:27

Mi configuración era así. Tenía un QuartzJob , un Frijol de Servicio , y Dao . como de costumbre se configuró con LocalSessionFactoryBean (para hibernate) , y SchedulerFactoryBean para Quartz framework. mientras escribía el trabajo de Cuarzo, por error lo anoté con @ Service , no debería haberlo hecho porque estaba usando otra estrategia para cablear el QuartzBean usando AutowiringSpringBeanJobFactory extendiendo SpringBeanJobFactory .

Así que lo que realmente estaba sucediendo es que debido a Quartz Autowire, TX se estaba inyectando al Job Bean y al mismo tiempo se estableció el contexto Tx en virtud de la anotación @Service y, por lo tanto, ¡el TX se estaba saliendo de sincronización !!

Espero que ayude a aquellos para quienes las soluciones anteriores realmente no resolvieron el problema. Estaba usando Spring 4.2.5 e Hibernar 4.0.1 ,

Veo que en este hilo hay una sugerencia innecesaria de agregar @ Transaccional anotación al DAO (@Repositorio) , que es una sugerencia inútil causa @Repositorio tiene todo lo que necesita tener no tiene que establecer especialmente que @transaccional en DAOs , ya que los DAOs son llamados desde los servicios que ya han sido inyectados por @Trasancational . Espero que esto pueda ser útil para las personas que están utilizando cuarzo, Primavera e Hibernación juntos.

 0
Author: SANJAY GAUTAM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-13 03:04:02

Añade transaction-manager a tu <annotation-driven/>en spring-servlet.xml:

<tx:annotation-driven transaction-manager="yourTransactionBeanID"/>
 0
Author: Majid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-01 18:48:03

Comprueba tu clase dao. Debe ser así:

Session session = getCurrentSession();
Query query = session.createQuery(GET_ALL);

Y anotaciones:

@Transactional
@Repository
 0
Author: Женя Осмоловская,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-06 19:00:15

Debe permitir la transacción a su método DAO. Añadir,

@Transaccional (readOnly = true, propagation = Propagation.NOT_SUPPORTED)

Sobre sus métodos dao. And @Transactional shoul be of package,

Org.springframework.transacción.anotación.Transaccional

 0
Author: RahuL Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-04 13:44:18