Guia para o Hibernate 4 com Spring

Guia para o Hibernate 4 com Spring

1. Visão geral

Este artigo se concentrará na configuração deHibernate 4 with Spring - veremos como configurar o Spring com Hibernate 4 usando Java e XML. Partes desse processo são comuns athe Hibernate 3 article.

2. Maven

Para adicionar as dependências do Spring Persistence ao projetopom.xml, consultearticle focused on the Spring and Maven dependencies.

Continuando com o Hibernate 4, as dependências do Maven são simples:


   org.hibernate
   hibernate-core
   4.3.6.Final

Então, para permitir que o Hibernate use seu modelo de proxy, precisamos do javassist também:


   org.javassist
   javassist
   3.18.2-GA

E como usaremos MySQL para este tutorial, também precisaremos:


   mysql
   mysql-connector-java
   5.1.32
   runtime

E, finalmente, estamos usando umconnection pool adequado em vez da implementação do Spring somente para desenvolvimento - oDriverManagerDataSource. Estamos usando aqui oTomcat JDBC Connection Pool:


    org.apache.tomcat
    tomcat-dbcp
    7.0.55

3. Java Configuração Spring para Hibernate 4

Para usarHibernate 4 in a project, algumas coisas mudaram no lado da configuração ao mover de uma configuração do Hibernate 3.

O principal aspecto que é diferente ao atualizar do Hibernate 3 é a forma de criar oSessionFactory with Hibernate 4.

Isso agora é feito usandoLocalSessionFactoryBean do pacotehibernate4 - que substitui oAnnotationSessionFactoryBean antigo do pacotehibernate3. O novoFactoryBean tem a mesma responsabilidade - ele inicializa oSessionFactory a partir da verificação de anotação. Isso é necessário porque, começando com o Hibernate 3.6, o antigoAnnotationConfigurationwas merged emConfiguratione o novo Hibernate 4LocalSessionFactoryBean está usando este novo mecanismoConfiguration.

Também é importante notar que, no Hibernate 4, o métodoConfiguration.buildSessionFactory e o mecanismohave also been deprecatedin favor deConfiguration.buildSessionFactory(ServiceRegistry) - que o SpringLocalSessionFactoryBean ainda não está usando.

A configuração do Spring Java para o Hibernate 4:

@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:persistence-mysql.properties" })
@ComponentScan({ "org.example.spring.persistence" })
public class PersistenceConfig {

   @Autowired
   private Environment env;

   @Bean
   public LocalSessionFactoryBean sessionFactory() {
      LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
      sessionFactory.setDataSource(restDataSource());
      sessionFactory.setPackagesToScan(
        new String[] { "org.example.spring.persistence.model" });
      sessionFactory.setHibernateProperties(hibernateProperties());

      return sessionFactory;
   }

   @Bean
   public DataSource restDataSource() {
      BasicDataSource dataSource = new BasicDataSource();
      dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
      dataSource.setUrl(env.getProperty("jdbc.url"));
      dataSource.setUsername(env.getProperty("jdbc.user"));
      dataSource.setPassword(env.getProperty("jdbc.pass"));

      return dataSource;
   }

   @Bean
   @Autowired
   public HibernateTransactionManager transactionManager(
     SessionFactory sessionFactory) {

      HibernateTransactionManager txManager
       = new HibernateTransactionManager();
      txManager.setSessionFactory(sessionFactory);

      return txManager;
   }

   @Bean
   public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
      return new PersistenceExceptionTranslationPostProcessor();
   }

   Properties hibernateProperties() {
      return new Properties() {
         {
            setProperty("hibernate.hbm2ddl.auto",
              env.getProperty("hibernate.hbm2ddl.auto"));
            setProperty("hibernate.dialect",
              env.getProperty("hibernate.dialect"));
            setProperty("hibernate.globally_quoted_identifiers",
             "true");
         }
      };
   }
}

4. Configuração XML Spring para Hibernate 4

Da mesma forma,Hibernate 4 can be configured with XML também:




    
    
    
        
            ${hibernate.hbm2ddl.auto}
            ${hibernate.dialect}
        
    



    
    
    
    



    


Para inicializar o XML no Spring Context, podemos usar um arquivo Java Configuration simples se o aplicativo estiver configurado com a configuração Java:

@Configuration
@EnableTransactionManagement
@ImportResource({ "classpath:hibernate4Config.xml" })
public class HibernateXmlConfig{
   //
}

Como alternativa, podemos simplesmente fornecer o arquivo XML para o Spring Context, se a configuração geral for puramente XML.

Para ambos os tipos de configuração, as propriedades específicas do JDBC e Hibernate são armazenadas em um arquivo de propriedades:

# jdbc.X
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring_hibernate_dev?createDatabaseIfNotExist=true
jdbc.user=tutorialuser
jdbc.pass=tutorialmy5ql

# hibernate.X
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.show_sql=false
hibernate.hbm2ddl.auto=create-drop

5. Spring, Hibernate e MySQL

Os Drivers e Dialetos suportados pelo Hibernatehave been extensively discussed para Hibernate 3 - e tudo ainda se aplica ao Hibernate 4 também.

6. Uso

Neste ponto, o Hibernate 4 está totalmente configurado com Spring e podemosinject the raw Hibernate SessionFactory diretamente sempre que precisarmos:

public abstract class BarHibernateDAO{

   @Autowired
   SessionFactory sessionFactory;

   ...

   protected Session getCurrentSession(){
      return sessionFactory.getCurrentSession();
   }
}

Uma observação importante aqui é que agora é a maneira recomendada de usar a API do Hibernate - oHibernateTemplate mais antigo não está mais incluído no novo pacoteorg.springframework.orm.hibernate4, pois não deve ser usado com o Hibernate 4.

7. Conclusão

Neste exemplo,we configured Spring with Hibernate 4 - ambos com configuração Java e XML.

Como sempre, o código apresentado neste artigo está disponívelover on Github. Este é um projeto baseado em Maven, portanto, deve ser fácil importar e executar como está.