Spring 3.1 + Hibernate 4 - Problema com SessionFactory

Bom dia, estou tentando configurar uma SessionFactory do Spring com o hibernate, porém ao subir a aplicação O Logger do Hibernate escreve :

    INFO: HHH000041: Configured SessionFactory: null

E quando eu tendo dar um sessionFactory.getCurrentSession(), ele me retorna null sempre.

Seguem as configurações :

hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 
<hibernate-configuration>
    
    <session-factory>
    	<mapping class="model.Pessoa" />
        <mapping class="model.Usuario" />
        <mapping class="model.Materia" />
        <mapping class="model.Prova" />
        <mapping class="model.Questao" />
        <mapping class="model.Alternativa" />
        <mapping class="model.ProvaRealizada" />
        <mapping class="model.Telefone" />
        <mapping class="model.Endereco" />
        <mapping class="model.Estado" />
        <mapping class="model.Pais" />
    </session-factory>
         
</hibernate-configuration>

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:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:lang="http://www.springframework.org/schema/lang"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
        http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
 
    <context:annotation-config/>
    <context:component-scan base-package="." />
 
    <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="suffix" value=".jsp" />
    </bean>

    <bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
        p:driverClassName="org.postgresql.Driver"
        p:url="jdbc:postgresql://localhost:5432/yttria" p:username="postgres"
        p:password="projetos" />
 
 
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
            </props>
        </property>
    </bean>
 
    <tx:annotation-driven />
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
</beans>

Classe com a SessionFactory

package dao;

import model.Usuario;

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

@Repository
public class UsuarioDao extends GenericDao<Usuario>{
	
	private SessionFactory sessionFactory;
	
	public UsuarioDao(){
		super(Usuario.class);
	}
	
	@Autowired
	public void setSessionFactory(SessionFactory sessionFactory){
		this.sessionFactory = sessionFactory;
		super.setSessionFactory(sessionFactory);
	}
	
}

GenericDao que todos os Daos Extendem:


package dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Criterion;

public class GenericDao<T extends Serializable> implements IDao<T>{
	
	private Class<T> typeClass;
	private SessionFactory sessionFactory;
	
	public GenericDao(Class<T> type) {
		typeClass = type;
	}

	private List<T> listAll() {
		List<T> result = null;
		Query query = getSession().createQuery("from " + typeClass.getName());
		result = query.list();
		return result;
	}

	@Override
	public List<T> list(Criterion[] criterions) {
		Criteria criteria = getSession().createCriteria(typeClass);
		List<T> result = null;
		if(criterions != null){
			loadCriterions(criterions, criteria);	
		}
		result = criteria.list();
		return result;
	}
	
	@Override
	public T save(T obj) {
		return (T) getSession().save(obj);
	}

	@Override
	public void update(Criterion[] criterions, T obj) {
		if(obj == null){
			Criteria criteria =  getSession().createCriteria(typeClass);
			loadCriterions(criterions, criteria);
			obj = (T) criteria.uniqueResult();
		}
		getSession().update(obj);
	}

	@Override
	public void delete(Criterion[] criterions, T objDel) {
		if(objDel == null){
			Criteria criteria = getSession().createCriteria(typeClass);
			loadCriterions(criterions, criteria);
			objDel = (T) criteria.uniqueResult();
		}
		getSession().delete(objDel);
	}
	
	@Override
	public T load(Criterion[] criterions) {
		Criteria criteria = getSession().createCriteria(typeClass);
		T result = null;
		if (criterions != null){
			loadCriterions(criterions, criteria);
			result = (T) criteria.uniqueResult();
		}
		return result;
	}
	
	private void loadCriterions(Criterion[] criterions, Criteria criteria){
		for (Criterion ct : criterions) {
			criteria.add(ct);
		}
	}
	
	public void setSessionFactory(SessionFactory sessionFactory){
		this.sessionFactory = sessionFactory;
	}
	
	private Session getSession(){
		return sessionFactory.getCurrentSession();
	}
}

Já tive um problema semelhante. Sei que não é a melhor solução, mas só funcionou quando adicionei a sessionFactory como parametro no construtor do Dao.

@Autowired public UsuarioDao(SessionFactory sessionFactory) { super.setSessionFactory(sessionFactory); }

Obrigado pela resposta, mas infelizmente ainda não funcionou, continua configurando a sessionFactory como null … :confused:

Tenta configurar assim:

 &lt;bean id="sessionFactory"  
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"&gt;  
        &lt;property name="dataSource" ref="dataSource" /&gt;  
        &lt;property name="packagesToScan" value="model"/&gt;
       &lt;!-- &lt;property name="configLocation"&gt;  
            &lt;value&gt;classpath:hibernate.cfg.xml&lt;/value&gt;  
        &lt;/property&gt; --&gt; 
        &lt;property name="hibernateProperties"&gt;  
            &lt;props&gt;  
                &lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.PostgreSQLDialect&lt;/prop&gt;  
                &lt;prop key="hibernate.show_sql"&gt;true&lt;/prop&gt;  
                &lt;prop key="hibernate.format_sql"&gt;true&lt;/prop&gt;  
            &lt;/props&gt;  
        &lt;/property&gt;  
    &lt;/bean&gt;  

No DAO tenta assim:

[code]
package dao;

import model.Usuario;

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

@Repository
public class UsuarioDao extends GenericDao<Usuario>{

private SessionFactory sessionFactory;  

@Autowired  
public UsuarioDao(SessionFactory sessionFactory){  
    super(Usuario.class, sessionFactory);
}  
/**  
@Autowired  
public void setSessionFactory(SessionFactory sessionFactory){  
    this.sessionFactory = sessionFactory;  
    super.setSessionFactory(sessionFactory);  
}  */

} [/code]


public class GenericDao&lt;T extends Serializable&gt; implements IDao&lt;T&gt;{  
      
    private Class&lt;T&gt; typeClass;  
    private SessionFactory sessionFactory;  
      
    public GenericDao(Class&lt;T&gt; type, SessionFactory sessionFactory) {  
        typeClass = type; 
        this.sessionFactory = sessionFactory; 
    }  

...

Oppa, eu fiz o que você disse e acho que ele está setando a sessionFactory agora, pois coloquei o debugg no método setSessionFactory e ele obtem uma sessionFactory válida, porém estou com outro problema que acho que é ao obter a instância de UsuarioService para realizar a operação.

Nesta classe eu realizo a chamada do service:

package controller;

[...]

@Controller
public class TestClass extends HttpServlet {
	
	UsuarioService userService;
	
[...]

	@RequestMapping(value="/spring/test")
	protected void responds(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Usuario user = new Usuario();
		
		user.setLogin("teste");
		user.setSenha("testeSenha");
      // SpringUtil.getAppCtx() = Retorna uma instância de "ClassPathXmlApplicationContext"
		SpringUtil.getAppCtx().getBean(UsuarioService.class).save(user);

		
	}
	
	@Autowired
	public void setUsuarioService(UsuarioService userService){
		this.userService = userService;
	}
	
}

O UsuarioService:


package service;

[...]

@Service
public class UsuarioService implements IService<Usuario> {
	
	private UsuarioDao usuarioDao;
	
	[...]Métodos que chamam os métodos do UsuarioDao[...]
	
	@Autowired
	public void setUsuarioDao(UsuarioDao usuarioDao){
		this.usuarioDao = usuarioDao;
	}
	
}

A classe UsuarioDao

package dao;

[...]

@Repository
public class UsuarioDao extends GenericDao<Usuario>{
	
	private SessionFactory sessionFactory;
	
	@Autowired
	public UsuarioDao(SessionFactory sessionFactory){
		super(Usuario.class, sessionFactory);
		this.sessionFactory = sessionFactory;
	}
	
}

E por fim a GenericDao


package dao;

[...]

public class GenericDao<T extends Serializable> implements IDao<T>{
	
	private Class<T> typeClass;
	private SessionFactory sessionFactory;
	
	public GenericDao(Class<T> type, SessionFactory sessionFactory) {
		typeClass = type;
		this.sessionFactory = sessionFactory;
	}

	private List<T> listAll() {
		[...]
	}

	@Override
	public List<T> list(Criterion[] criterions) {
		[...]
	}
	
	@Override
	public T save(T obj) {
		[...]
	}

	@Override
	public void update(Criterion[] criterions, T obj) {
		[...]
	}

	@Override
	public void delete(Criterion[] criterions, T objDel) {
		[...]
	}
	
	@Override
	public T load(Criterion[] criterions) {
		[...]
	}
	
	private void loadCriterions(Criterion[] criterions, Criteria criteria){
		[...]
	}
	
	public void setSessionFactory(SessionFactory sessionFactory){
		this.sessionFactory = sessionFactory;
	}
	
	private Session getSession(){
		return sessionFactory.getCurrentSession();
	}
}

E o erro quando eu executo a TestClass

org.hibernate.HibernateException: No Session found for current thread
	at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
	at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:941)
	at dao.GenericDao.getSession(GenericDao.java:87)
	at dao.GenericDao.save(GenericDao.java:42)
	at service.UsuarioService.save(UsuarioService.java:20)
	at controller.TestClass.responds(TestClass.java:47)
	at controller.TestClass.doGet(TestClass.java:33)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at appListenersAndFilters.AccessController.doFilter(AccessController.java:26)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)

Tenta adicionar a anotação @Transactional em UsuarioService:

@Service  
@Transactional
public class UsuarioService implements IService&lt;Usuario&gt; {
[...]
}

Pessoal, arrumei as classes como vocês sugeriram, porém minhas classes não estão sendo injetadas pelo Spring, segue o meu appContext.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:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:lang="http://www.springframework.org/schema/lang"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
        http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
 	
 	<context:component-scan base-package="."/>
 	<context:annotation-config/> 
	<tx:annotation-driven/>
	
	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="org.postgresql.Driver" />
		<property name="url" value="jdbc:postgresql://127.0.0.1/yttria" />
		<property name="username" value="postgres" />
		<property name="password" value="projetos" />
	</bean>
 
	<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="annotatedClasses">
			<list>
				<value>model.Prova</value>
				<value>model.Usuario</value>
				<value>model.Telefone</value>
				<value>model.Questao</value>
				<value>model.ProvaRealizada</value>
				<value>model.Pessoa</value>
				<value>model.Pais</value>
				<value>model.Materia</value>
				<value>model.Estado</value>
				<value>model.Endereco</value>
				<value>model.Alternativa</value>
			</list>
		</property>
		
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.format_sql">true</prop>
			</props>
		</property>
	</bean>

</beans>

E a injeção da dependência via Annotation:

	private UsuarioService uService;
	
	@Autowired
	public void setUsuarioService(UsuarioService uService){
		this.uService = uService;
	}

vlw, aee pessoal, obrigado pela paciência…

alguém ?