Hibernate 3 avec Spring

1. Vue d'ensemble

Cet article se concentrera sur la configuration d' Hibernate 3 avec Spring - nous verrons comment utiliser la configuration XML et Java pour configurer Spring avec Hibernate 3 et MySQL.

Mise à jour: cet article est axé sur Hibernate 3. Si vous recherchez la version actuelle d'Hibernate, cet article est axé dessus.

2. Configuration Java Spring pour Hibernate 3

La configuration d'Hibernate 3 avec Spring et Java config est simple:

import java.util.Properties; import javax.sql.DataSource; import org.apache.tomcat.dbcp.dbcp.BasicDataSource; 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.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; import org.springframework.orm.hibernate3.HibernateTransactionManager; import org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean; import org.springframework.transaction.annotation.EnableTransactionManagement; import com.google.common.base.Preconditions; @Configuration @EnableTransactionManagement @PropertySource({ "classpath:persistence-mysql.properties" }) @ComponentScan({ "com.baeldung.spring.persistence" }) public class PersistenceConfig { @Autowired private Environment env; @Bean public AnnotationSessionFactoryBean sessionFactory() { AnnotationSessionFactoryBean sessionFactory = new AnnotationSessionFactoryBean(); sessionFactory.setDataSource(restDataSource()); sessionFactory.setPackagesToScan(new String[] { "com.baeldung.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")); } }; } }

Par rapport à la configuration XML - décrite ci-après - il existe une petite différence dans la manière dont un bean de la configuration accède à un autre. En XML, il n'y a aucune différence entre pointer vers un bean ou pointer vers une fabrique de bean capable de créer ce bean . Étant donné que la configuration Java est de type sécurisé - pointer directement vers la fabrique de bean n'est plus une option - nous devons récupérer le bean de l'usine de bean manuellement:

txManager.setSessionFactory(sessionFactory().getObject());

3. Configuration XML Spring pour Hibernate 3

De même, nous pouvons également configurer Hibernate 3 avec une configuration XML :

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

Ensuite, ce fichier XML est amorcé dans le contexte Spring à l'aide d'une classe @Configuration :

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

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

4. Spring, Hibernate et MySQL

L'exemple ci-dessus utilise MySQL 5 comme base de données sous-jacente configurée avec Hibernate - cependant, Hibernate prend en charge plusieurs bases de données SQL sous-jacentes.

4.1. Le conducteur

Le nom de la classe Driver est configuré via la propriété jdbc.driverClassName fournie à DataSource.

Dans l'exemple ci-dessus, il est défini sur com.mysql.jdbc.Driver à partir de la dépendance mysql-connector-java que nous avons définie dans le pom, au début de l'article.

4.2. Le dialecte

Le Dialect est configuré via la propriété hibernate.dialect fournie à Hibernate SessionFactory .

Dans l'exemple ci-dessus, il est défini sur org.hibernate.dialect.MySQL5Dialect car nous utilisons MySQL 5 comme base de données sous-jacente. Il existe plusieurs autres dialectes prenant en charge MySQL :

  • org.hibernate.dialect.MySQL5InnoDBDialect - pour MySQL 5.x avec le moteur de stockage InnoDB
  • org.hibernate.dialect.MySQLDialect - pour MySQL antérieur à 5.x
  • org.hibernate.dialect.MySQLInnoDBDialect - pour MySQL antérieur à 5.x avec le moteur de stockage InnoDB
  • org.hibernate.dialect.MySQLMyISAMDialect - pour toutes les versions de MySQL avec le moteur de stockage ISAM

Hibernate prend en charge les dialectes SQL pour chaque base de données prise en charge.

5. Utilisation

À ce stade, Hibernate 3 est entièrement configuré avec Spring et nous pouvons injecter directement Hibernate SessionFactory à chaque fois que nous en avons besoin:

public abstract class FooHibernateDAO{ @Autowired SessionFactory sessionFactory; ... protected Session getCurrentSession(){ return sessionFactory.getCurrentSession(); } }

6. Maven

Pour ajouter les dépendances Spring Persistence au pom, veuillez consulter l'exemple Spring with Maven - nous devrons définir à la fois spring-context et spring-orm .

En continuant vers Hibernate 3, les dépendances Maven sont simples:

 org.hibernate hibernate-core 3.6.10.Final 

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

 org.javassist javassist 3.18.2-GA 

Nous allons utiliser MySQL comme base de données pour ce tutoriel, nous aurons donc également besoin de:

 mysql mysql-connector-java 5.1.32 runtime 

Et enfin, nous n'utiliserons pas l'implémentation de la source de données Spring - DriverManagerDataSource ; à la place, nous utiliserons une solution de pool de connexions prête pour la production - Tomcat JDBC Connection Pool:

 org.apache.tomcat tomcat-dbcp 7.0.55 

7. Conclusion

Dans cet exemple, nous avons configuré Hibernate 3 avec Spring - à la fois avec une configuration Java et XML. La mise en œuvre de ce projet simple peut être trouvée dans le projet GitHub - il s'agit d'un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.