Hibernate 3 con Spring

1. Información general

Este artículo se centrará en configurar Hibernate 3 con Spring ; veremos cómo usar la configuración XML y Java para configurar Spring con Hibernate 3 y MySQL.

Actualización: este artículo se centra en Hibernate 3. Si está buscando la versión actual de Hibernate, este es el artículo que se centra en ella.

2. Configuración de Java Spring para Hibernate 3

Configurar Hibernate 3 con Spring y Java config es sencillo:

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")); } }; } }

En comparación con la configuración XML, que se describe a continuación, hay una pequeña diferencia en la forma en que un bean de la configuración accede a otro. En XML no hay diferencia entre apuntar a un bean o apuntar a una fábrica de frijoles capaz de crear ese bean . Dado que la configuración de Java es de tipo seguro, apuntar directamente a la fábrica de frijoles ya no es una opción, necesitamos recuperar el bean de la fábrica de frijoles manualmente:

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

3. Configuración de XML Spring para Hibernate 3

De manera similar, también podemos configurar Hibernate 3 con configuración XML :

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

Luego, este archivo XML se inicia en el contexto de Spring usando una clase @Configuration :

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

Para ambos tipos de configuración, las propiedades específicas de JDBC e Hibernate se almacenan en un archivo de propiedades:

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

El ejemplo anterior usa MySQL 5 como la base de datos subyacente configurada con Hibernate; sin embargo, Hibernate admite varias bases de datos SQL subyacentes.

4.1. El conductor

El nombre de la clase del controlador se configura mediante la propiedad jdbc.driverClassName proporcionada a DataSource.

En el ejemplo anterior, se establece en com.mysql.jdbc.Driver desde la dependencia mysql-connector-java que definimos en el pom, al comienzo del artículo.

4.2. El dialecto

El dialecto se configura mediante la propiedad hibernate.dialect proporcionada a Hibernate SessionFactory .

En el ejemplo anterior, esto se establece en org.hibernate.dialect.MySQL5Dialect ya que estamos usando MySQL 5 como base de datos subyacente. Hay varios otros dialectos que admiten MySQL :

  • org.hibernate.dialect.MySQL5InnoDBDialect - para MySQL 5.x con el motor de almacenamiento InnoDB
  • org.hibernate.dialect.MySQLDialect - para MySQL anterior a 5.x
  • org.hibernate.dialect.MySQLInnoDBDialect - para MySQL antes de 5.x con el motor de almacenamiento InnoDB
  • org.hibernate.dialect.MySQLMyISAMDialect - para todas las versiones de MySQL con el motor de almacenamiento ISAM

Hibernate admite dialectos SQL para todas las bases de datos compatibles.

5. Uso

En este punto, Hibernate 3 está completamente configurado con Spring y podemos inyectar la SessionFactory de Hibernate sin procesar directamente siempre que necesitemos:

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

6. Maven

Para agregar las dependencias de Spring Persistence al pom, consulte el ejemplo de Spring con Maven; necesitaremos definir tanto el contexto de primavera como el orden de primavera .

Continuando con Hibernate 3, las dependencias de Maven son simples:

 org.hibernate hibernate-core 3.6.10.Final 

Luego, para permitir que Hibernate use su modelo de proxy, también necesitamos javassist :

 org.javassist javassist 3.18.2-GA 

Usaremos MySQL como nuestra base de datos para este tutorial, por lo que también necesitaremos:

 mysql mysql-connector-java 5.1.32 runtime 

Y finalmente, no usaremos la implementación de la fuente de datos Spring: DriverManagerDataSource ; en su lugar, usaremos una solución de grupo de conexiones lista para producción: Tomcat JDBC Connection Pool:

 org.apache.tomcat tomcat-dbcp 7.0.55 

7. Conclusión

En este ejemplo, configuramos Hibernate 3 con Spring , tanto con configuración Java como XML. La implementación de este proyecto simple se puede encontrar en el proyecto GitHub; este es un proyecto basado en Maven, por lo que debería ser fácil de importar y ejecutar tal como está.