Spring Hibernate – Não foi possível obter a session sincronizada por transação para o thread atual

Eu criei uma aplicação com spring + hibernate, mas eu sempre recebo este erro. Esta é a minha primeira aplicação com hibernação, li alguns guias mas não consigo resolver este problema. Onde estou fazendo errado?

Este é o código da minha aplicação

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  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  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  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  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 colorservlets.StudentDAOImpl.create(StudentDAOImpl.java:19) at colorservlets.MainApp.main(MainApp.java:14) 

student.java

 package colorservlets; 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 

studentDAO.java

 package colorservlets; import org.hibernate.SessionFactory; public interface StudentDAO { public void setSessionFactory(SessionFactory sessionFactory); public void create(String name,Integer age); }//StudentDAO 

StudentDAOImpl.java

 package colorservlets; 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 colorservlets; 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

                 hibernate.dialect=org.hibernate.dialect.MySQLDialect     

sql

 create table student ( id integer not null auto_increment, name varchar(20) not null, age integer not null, primary key(id) ); 

Você deve ativar o suporte a transactions ( ou @EnableTransactionManagement ) e declarar o transactionManager e ele deve funcionar através do SessionFactory .

Você deve adicionar @Transactional ao seu @Repository

Com o @Transactional no seu @Repository Spring é capaz de aplicar suporte transacional em seu repository.

Sua class Student não possui as annotations @ javax.persistence. * Como @Entity , estou assumindo que a Configuração de Mapeamento para essa class foi definida através de XML.

Eu tive o mesmo problema, mas em uma class que não fazia parte da camada de serviço. No meu caso, o gerenciador de transactions era simplesmente obtido do contexto pelo método getBean() e a class pertencia à camada de visualização – meu projeto utiliza a técnica OpenSessionInView .

O método sessionFactory.getCurrentSession() está causando a mesma exceção que o autor. A solução para mim foi bastante simples.

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

Se o getCurrentSession() falhar, o openSession() deve fazer o truque.

Adicione a anotação @Transactional da primavera no serviço de class

@Transactional = javax.transaction.Transactional colocá-lo apenas ao lado @Repository

Em seu xyz.DAOImpl.java

Siga os seguintes passos:

// Etapa 1: Definir a fábrica da session

 @Resource(name="sessionFactory") private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sf) { this.sessionFactory = sf; } 

// Passo-2: Tente obter a session atual e pegue a exceção HibernateException.


// Passo 3: Se houver alguma exceção do HibernateException, então true para obter o openSession.

 try { //Step-2: Implementation session = sessionFactory.getCurrentSession(); } catch (HibernateException e) { //Step-3: Implementation session = sessionFactory.openSession(); } 

Eu tive esse erro também porque no arquivo onde eu usei anotação @Transactional , eu estava importando a class errada

 import javax.transaction.Transactional; 

Em vez de javax, use

 import org.springframework.transaction.annotation.Transactional; 

Eu encontrei o mesmo problema e finalmente descobri que o não foi definido dentro do [dispatcher] -servlet.xml onde o elemento component-scan habilitou a class anotada @service.

Basta colocar o elemento de varredura de componentes juntos, o problema desapareceu.

Meu problema semelhante foi corrigido com menos de duas abordagens.

  1. Por meio do manuseio manual de transactions.

    Sessão session = sessionFactory.getCurrentSession ();

    Transação tx = session.beginTransaction ();

    UserInfo user = (UserInfo) session.get (UserInfo.class, 1);

    tx.commit ();

  2. Diga ao Spring para abrir e gerenciar transactions para você em seus filtros web.xml e certifique-se de usar @Repository @Transactional

    hibernateFilter org.springframework.orm.hibernate5.support.OpenSessionInViewFilter sessionFactory session.factory hibernateFilter / *

Desculpe pela formatação incorreta.

Eu adicionei essas configurações no web.xml e funciona bem para mim!

  OpenSessionInViewFilter org.springframework.orm.hibernate5.support.OpenSessionInViewFilter  sessionFactoryBeanName sessionFactory   flushMode AUTO    OpenSessionInViewFilter /*  

Além disso, a resposta mais classificada me dá pistas para evitar que o aplicativo entre em pânico na primeira execução.

Minha configuração foi assim. Eu tinha um QuartzJob , um Service Bean e Dao. como de costume, ele foi configurado com a estrutura LocalSessionFactoryBean (para hibernate) e SchedulerFactoryBean for Quartz. enquanto escrevia o job do Quartz, por engano anotei-o com @ Service , eu não deveria ter feito isso porque estava usando outra estratégia para conectar o QuartzBean usando o AutowiringSpringBeanJobFactory estendendo o SpringBeanJobFactory .

Então, o que realmente estava acontecendo era que, devido ao Quartz Autowire, o TX estava sendo injetado no Job Bean e, ao mesmo tempo, o Tx Context foi definido em virtude da anotação @ Service e, portanto, o TX estava caindo fora de sincronia !!

Espero que ajude aqueles para quem as soluções acima realmente não resolveram o problema. Eu estava usando o Spring 4.2.5 e o Hibernate 4.0.1,

Vejo que neste tópico há uma sugestão desnecessária para adicionar @ Anotação transacional ao DAO (@ Repositório ), que é uma causa de sugestão inútil @ O repository tem tudo o que ele precisa para não ter que configurar especialmente aquele @ transacional em DAOs, como os DAOs são chamados dos serviços que já foram injetados pela @Trasancational . Espero que isso possa ser útil para as pessoas que estão usando Quartz, Spring e Hibernate juntas.

Adicione o transaction-manager ao seu no spring-servlet.xml:

  

Verifique sua class dao. Deve ser assim:

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

E annotations:

 @Transactional @Repository