Configurar Spring 4 com Hibernate Session Factory

Você está com dificuldades para configurar o hibernate “puro” utilizando o Session Factory com o Spring? Neste artigo iremos mostrar a configuração para essa integração. Antes disso vamos aprender alguns conceitos importantes.

Session Factory ou Entity Manager Factory?

Basicamente podemos comparar o Session Factory e o Entity Manager Factory como equivalentes, no qual o Session é para o Hibernate e o Entity para o JPA, lembrando que o JPA é uma especificação e o Hibernate uma implementação.

Mãos no código!

Estou partindo do princípio que vocês já definiram suas dependências do spring e do hibernate, caso tenha alguma dúvida sobre isso deixe nos comentários. Chega de enrolação e vamos ao que importa.

Dependência do Basic Data Source no Maven

Adicione a dependência do Basic Data Source no seu arquivo pom.xml do maven

<dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.4</version>
</dependency>

Criando Beans

Vamos criar os beans no arquivo de configuração do spring, mas que arquivo é esse? Nós estamos utilizando a configuração do spring com java config então você deve colocar esse bean dentro da classe que extends o WebMvcConfigurerAdapter beleza? Certo, então vamos criar um datasource com o código abaixo.

    @Bean(name = "datasource")
    public static DataSource dataSource() {
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName("org.postgresql.Driver");
        ds.setUrl("jdbc:postgresql://localhost:5432/test_database");
        ds.setUsername("postgres");
        ds.setPassword("");

        return ds;
    }

Feito isto vamos criar um bean para o Local Session Factory Bean

    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan(new String[]{"br.com.kelvinsantiago"});
        sessionFactory.setHibernateProperties(hibernateProperties());
        return sessionFactory;
    }

Agora vamos criar o nosso arquivo de properties da configuração do hibernate.

 private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect","org.hibernate.dialect.PostgreSQLDialect");
        properties.put("hibernate.show_sql", true);
        properties.put("hibernate.hbm2ddl.auto","update");
        return properties;
    }

E finalmente, nosso último bean, crie o bean do Hibernate Transaction Manager.

 @Bean
    @Autowired
    public HibernateTransactionManager transactionManager(SessionFactory sessionFactory){
        HibernateTransactionManager tx = new HibernateTransactionManager();
        tx.setSessionFactory(sessionFactory);
        return tx;
    }

Arquivo final

Após ter criado todos os beans seu arquivo final de configuração do spring deve estar da seguinte maneira:

package br.com.kelvinsantiago.configuracao;

import org.apache.commons.dbcp.BasicDataSource;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import javax.sql.DataSource;
import java.util.Properties;

@Configuration
@EnableTransactionManagement
@EnableWebMvc
@ComponentScan(basePackages = {"br.com.kelvinsantiago"})
public class ConfiguracaoWeb extends WebMvcConfigurerAdapter {

    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan(new String[]{"br.com.kelvinsantiago"});
        sessionFactory.setHibernateProperties(hibernateProperties());
        return sessionFactory;
    }

    private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect","org.hibernate.dialect.PostgreSQLDialect");
        properties.put("hibernate.show_sql", true);
        properties.put("hibernate.hbm2ddl.auto","update");
        return properties;
    }

    @Bean
    @Autowired
    public HibernateTransactionManager transactionManager(SessionFactory sessionFactory){
        HibernateTransactionManager tx = new HibernateTransactionManager();
        tx.setSessionFactory(sessionFactory);
        return tx;
    }


    @Bean(name = "datasource")
    public static DataSource dataSource() {
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName("org.postgresql.Driver");
        ds.setUrl("jdbc:postgresql://localhost:5432/test_database");
        ds.setUsername("postgres");
        ds.setPassword("");

        return ds;
    }

}

Concluindo

Bom, chegamos ao fim desse tutorial, espero que essa dica tenha contribuído para seu conhecimento, caso tenha alguma dúvida ou até mesmo queira deixar um feedback, e que é muito importante para nós, utilize o formulário de comentários abaixo.