Ahora vamos a montar un proyecto de spring, configurando Jpa 2.1 implementado por hibernate 4.3.
Como B.D vamos a usar una embebida (HSQLBD), para que el proyecto sea totalmente autónomo.
Para lo cual vamos a seguir los siguientes pasos:
- Establecer las dependencias necesarias para un proyecto Spring.
- Montar la configuración de spring.
- Montar la configuración de spring JPA.
- Crear el entorno de test.
- Montar un test, para que podamos probar nuestra configuración.
El ejemplo de este articulo lo podéis descargar del siguiente enlace https://github.com/blancoparis-tfc/SpringHibernate
Dependencias:
Primero vamos a ver que librerías que vamos a necesitar:Spring
Las dependencias relacionadas con la versión de spring, en nuestro ejemplo vamos a utilizar la versión 4.2.0.RELEASE.- Spring-context: Es la parte de spring encargada de levantar un contenedor de beans.
- Spring-orm: Es el modulo de spring que utilizaremos para trabajar con los orm, que en nuestro caso sera hibernate como implementación de JPA 2.1.
compile 'org.springframework:spring-context:4.2.0.RELEASE' compile 'org.springframework:spring-orm:4.2.0.RELEASE'
JPA2.1 + Hibernate 4.3
Las dependencias, relacionada con jpa2.1 + hibernate 4.3.10.FINAL.
- Hibernate-core: Es la implementación de hibernate normal.
- Hibernate-entitymanager: Es la integración de hibernate con JPA.
compile 'org.hibernate:hibernate-core:4.3.10.Final' compile 'org.hibernate:hibernate-entitymanager:4.3.10.Final'
B.D
Las dependencias, relacionadas como la B.D, que en nuestro caso sera la libreria de HSQLBD mas una implementación de el datasource.
- Hsqlbd: Es la bd embebida que vamos a utilizar.
- commons-dbcp: Es una implementación para el datasource, en un proyecto de producición podemos utilizar mejor este c3p0.
compile 'commons-dbcp:commons-dbcp:1.4' compile 'org.hsqldb:hsqldb:2.3.3'
Entorno de test:
La librería que vamos a utilizar, para realizar los test, que en nuestro caso será junit + la librería de test de spring.
- Junit: Es la librería que vamos a utilizar para realizar los test unitarios.
- Spring-test: Es la librería para poder lanzar spring, desde los entornos de test.
testCompile group: 'junit', name: 'junit', version: '4.+' testCompile 'org.springframework:spring-test:4.2.0.RELEASE'
Crear el proyecto
Ahora que ya sabemos cuales son las dependencias que necesitamos, vamos a crear el fichero de gradle para poder montar nuestro proyecto.
- Le tenemos que indicar, que es un proyecto de java y se va integrar con eclipse, para lo cual usaremos los pluging de (java,eclipse)
- La indicamos con que maquina de java, vamos a trabajar utilizando la variable sourceCompatibility
- Le indicamos que vamos a usar los repositorios de maven:
- Ponemos las dependencias que necesitemos.
apply plugin: 'java' apply plugin: 'eclipse' sourceCompatibility = 1.8 version = '1.0' repositories { mavenCentral() } dependencies { compile 'org.springframework:spring-context:4.2.0.RELEASE' compile 'org.springframework:spring-orm:4.2.0.RELEASE' compile 'commons-dbcp:commons-dbcp:1.4' compile 'org.hsqldb:hsqldb:2.3.3' compile 'org.hibernate:hibernate-core:4.3.10.Final' compile 'org.hibernate:hibernate-entitymanager:4.3.10.Final' testCompile group: 'junit', name: 'junit', version: '4.+' testCompile 'org.springframework:spring-test:4.2.0.RELEASE' }
Configuración de Spring:
Aquí vamos a ver las configuraciones necesarias para spring, en mi caso las colocaremos en el paquete org.dbp.core.config.
Configuración básica de spring
Vamos a ver que necesitamos para poder configurar Spring, mínimo. En este caso la verdad, lo único que le tenemos que indicar a spring en que paquete van a estar los beans con los que vamos a trabajar en nuestro caso sera (org.dbp.service).
- @Configuration: Le indicamos a spring, que es una clase para configurar spring.
- @ComponentScan: Le indicamos los paquetes donde se encontraran los beans del contexto, que en nuestro caso “org.dbp.service”
package org.dbp.core.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @Configuration @ComponentScan(basePackages = "org.dbp.service") public class TestConfiguracion { }
Configuración de JPA + Hibernate:
Para la configuración de la JPA, vamos a crear otra clase independiente donde estableceremos toda la configuración necesaria para la persistencia y que inyectaremos en la configuración general.
Para la persistencia tendremos que configurar los siguientes aspectos:
- Habilitar las transaciones: @EnableTransactionManagement
- El datasource: Configuraremos el datasource, que realizara la conexión con la B.D, con la que vamos a trabajar. (Si el día de mañana quisiéramos poner un pool de conexión aquí es donde se establecerá).
- El entityManagerFactory: Configuramos la factoria de los entityManager de JPA, que es donde pondremos la configuración de JPA necesarias.
- Las transaciones: Aquí configuramos las transacciones de jpa, con spring (Tengamos en cuenta que estas transacciones serán por orientación aspectos).
package org.dbp.core.config; import java.util.Properties; import javax.persistence.EntityManagerFactory; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.JpaVendorAdapter; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @EnableTransactionManagement public class TestJpaConfiguration { @Bean public DataSource getDataSource() { BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName("org.hsqldb.jdbcDriver"); dataSource.setUrl("jdbc:hsqldb:mem:pruebas"); dataSource.setUsername("sa"); dataSource.setPassword(""); return dataSource; } /** * Configuramos el entity manager en JPA. - Le indicamos el data source con * el que va a trabajar. - Le indicamos el paquete donde se encuentran las * clases. - Le pasamos el adaptador de JPA que en nuestro caso sera * hibernate. - Por otro lado le pasamos las propiedades. * * @return */ @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(getDataSource()); em.setPackagesToScan(new String[] { "org.dbp.bom" }); JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); em.setJpaVendorAdapter(vendorAdapter); em.setJpaProperties(propiedadesAdicionalesJpa()); return em; } /** * Le indicamos el tipo de configuraci�n que nos interesa para hibernate - * Le indicmaos que cada vez que entremos borre y cree las B.D. - Le * indicamos que utilice el dialecto con HSQL. * * Nota: este m�todo no es parte de la configuraci�n de spring. * * @return */ private Properties propiedadesAdicionalesJpa() { return new Properties() { { setProperty("hibernate.hbm2ddl.auto", "create"); setProperty("hibernate.jdbc.batch_size", "20"); setProperty("hibernate.show_sql", "true"); setProperty("hibernate.dialect","org.hibernate.dialect.HSQLDialect"); setProperty("hibernate.hbm2ddl.import_files","/META-INF/inicializar.sql"); } }; } /** * Configura las transaciones en JPA. * * @return */ @Bean public PlatformTransactionManager transactionManager(EntityManagerFactory emf){ JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(emf); return transactionManager; } }
Ahora simplemente tenemos que indicarle en la configuración general que importe esta configuración con @Import({TestJpaConfiguration.class})
Creamos una entidad.
Para poder probar la configuración, vamos a crear una entidad, en nuestro caso sera el típico ejemplo de usuario con los campos (id,login y descripción).
package org.dbp.bom; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Usuario implements Serializable{ @Id private Long id; private String login; private String nombre; public String getLogin() { return login; } public void setLogin(String login) { this.login = login; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } }
Test, para probar la configuración
Para poder probar esta configuración básica, la vamos a poner en el entorno de test, y llamando a un test, consultamos un registro y insertamos otro y así podemos ver que funciona correctamente.
package org.dbp.core.config; import static org.junit.Assert.*; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.dbp.bom.Usuario; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.Transactional; /** * Test para validar la configuración del JPA. * @author david * */ @RunWith(SpringJUnit4ClassRunner.class) @Transactional @ContextConfiguration(classes = TestConfiguracion.class) public class ConfigurationJpaTest { @PersistenceContext EntityManager em; @Test public void testRecuperarUnUsuario(){ Usuario usuario=em.find(Usuario.class, 1L); assertEquals("El id del usuario 1",new Long(1L),usuario.getId()); assertEquals("El login del usaurio","dblanco",usuario.getLogin()); assertEquals("El nombre","david blanco paris",usuario.getNombre()); } @Test public void testInsertarUsuario(){ Usuario usuario=new Usuario(); usuario.setId(2L); usuario.setLogin("perico"); usuario.setNombre("Perico el de los palotes"); em.persist(usuario); } }
Conclusión
En este articulo hemos visto como configurar, un proyecto de spring + jpa. Para no complicar en exceso la configuración lo he montado en un entorno de test, pero ese mismo fichero se lleva a una configuración de spring y nos vale igual.
Este comentario ha sido eliminado por el autor.
ResponderEliminarGracias por el aporte a la comunidad
ResponderEliminar