Guide pour Hibernate 4 avec Spring

Guide pour Hibernate 4 avec le printemps

1. Vue d'ensemble

Cet article se concentrera sur la configuration deHibernate 4 with Spring - nous verrons comment configurer Spring avec Hibernate 4 en utilisant à la fois la configuration Java et XML. Certaines parties de ce processus sont bien entendu communes auxthe Hibernate 3 article.

2. Maven

Pour ajouter les dépendances Spring Persistence au projetpom.xml, veuillez consulter lesarticle focused on the Spring and Maven dependencies.

Poursuivant avec Hibernate 4, les dépendances Maven sont simples:


   org.hibernate
   hibernate-core
   4.3.6.Final

Ensuite, pour permettre à Hibernate d’utiliser son modèle de proxy, nous avons également besoin du javassist:


   org.javassist
   javassist
   3.18.2-GA

Et puisque nous allons utiliser MySQL pour ce didacticiel, nous aurons également besoin de:


   mysql
   mysql-connector-java
   5.1.32
   runtime

Et enfin, nous utilisons unconnection pool approprié au lieu de l'implémentation Spring uniquement pour les développeurs - lesDriverManagerDataSource. Nous utilisons ici lesTomcat JDBC Connection Pool:


    org.apache.tomcat
    tomcat-dbcp
    7.0.55

3. Java Configuration de Spring pour Hibernate 4

Pour utiliserHibernate 4 in a project, certaines choses ont changé du côté de la configuration lors du passage d'une configuration Hibernate 3.

L'aspect principal qui diffère lors de la mise à niveau depuis Hibernate 3 est la manière de créer lesSessionFactory with Hibernate 4.

Ceci est maintenant fait en utilisant leLocalSessionFactoryBean du packagehibernate4 - qui remplace l'ancienAnnotationSessionFactoryBean du packagehibernate3. Le nouveauFactoryBean a la même responsabilité - il amorce leSessionFactory à partir de l'analyse des annotations. Cela est nécessaire car, à partir de Hibernate 3.6, l'ancienAnnotationConfigurationwas merged enConfiguration et donc le nouveau Hibernate 4LocalSessionFactoryBean utilise ce nouveau mécanismeConfiguration.

Il convient également de noter que, dans Hibernate 4, la méthodeConfiguration.buildSessionFactory et le mécanismehave also been deprecatedin favor deConfiguration.buildSessionFactory(ServiceRegistry) - que le SpringLocalSessionFactoryBean n'utilise pas encore.

La configuration Java de printemps pour 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. Configuration XML Spring pour Hibernate 4

De même,Hibernate 4 can be configured with XML également:




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



    
    
    
    



    


Pour amorcer le XML dans le contexte Spring, nous pouvons utiliser un simple fichier de configuration Java si l'application est configurée avec la configuration Java:

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

Alternativement, nous pouvons simplement fournir le fichier XML au contexte Spring, si la configuration globale est purement XML.

Pour les deux types de configuration, les propriétés spécifiques à JDBC et Hibernate sont stockées dans un fichier de propriétés:

# 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 et MySQL

Les pilotes et dialectes pris en charge par Hibernatehave been extensively discussed pour Hibernate 3 - et tout s'applique également à Hibernate 4.

6. Usage

À ce stade, Hibernate 4 est entièrement configuré avec Spring et nous pouvonsinject the raw Hibernate SessionFactory directement chaque fois que nous avons besoin de:

public abstract class BarHibernateDAO{

   @Autowired
   SessionFactory sessionFactory;

   ...

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

Une note importante ici est que c'est désormais la manière recommandée d'utiliser l'API Hibernate - l'ancienHibernateTemplate n'est plus inclus dans le nouveau packageorg.springframework.orm.hibernate4 car il ne devrait pas être utilisé avec Hibernate 4.

7. Conclusion

Dans cet exemple,we configured Spring with Hibernate 4 - à la fois avec une configuration Java et XML.

Comme toujours, le code présenté dans cet article est disponibleover on Github. Ceci est un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.