Spring,JPA, Hibernate y Annotations
22-02-2012
Raul Vicente
Clasificado como:
DESARROLLO DE SOFTWARE ,
Eclipse ,
Hibernate ,
Inyección de dependencias ,
JAVA ,
JPA ,
PATRONES DE DISEÑO ,
Spring Framework ,
WEBDEV ,
persistencia en java
Continuando con la serie de artículos que estoy haciendo sobre persistencia en Java con Spring y un XML mínimo, primero fue Spring-JDBC, luego Spring y Mybatis, después Spring e Hibernate y esta vez y para cerrar el círculo le ha tocado el círculo a JPA. Para los que no lo hayais usado nunca JPA es una capa que aisla la persistencia del ORM que estemos utilizando, de tal manera que si un día cambiamos de ORM con cambiar la configuración sería suficiente y no haría falta tocar el código de la capa de persistencia, un cocepto parecido al que implementa Hibernate con los lenguajes de las diferentes bases de datos. Tiene un lenguaje objeto relacional el JPL (primo hermano del HQL, yo al menos no he visto diferencias demasiado grandes) y se pueden mapear las tablas utilizando annotations en los propios beans. De hecho, en el artículo de Hibernate comenté que utilizaba las annotations de JPA que implementa Hibernate. Como en los casos anteriores iré comentando el código sobre la marcha.
Con todo lo que he contado hay una palabra del título que no se sabe de donde sale Hibernate, bien como ya he dajado caer voy a utilizar Hibernate como ORM, pero como veréis no voy a utilizar código propio de Hibernate sino que voy a dejar que JPA lo genere por mí. Como son muchas cosas voy a ir paso a paso.
1) Creamos los beans con los mapeos. Voy a utilizar el ejemplo del instituto al igual que en los otros caso y mostraré el código de la clase Alumno, la clase Asignatura sería igual pero en sentido contrario
El bean es exáctamente idéntico al que hicimos en el caso de Spring+Hibernate. Simplemente comentar que mapeamos cada columna de la tabla con cada propieadad y que mapeamos la relación M:N en te alumnos y asignaturas. 2)Programamos la interfaz del DAO para los alumnos
Esta interfaz es igual para todos los ejemplos y simplemente contiene la definición de las operaciones a realizar sobre los alumnos.
3) Implementamos la interfaz IAlumnoDao
Como siempre utilizamos la annotation @Repository para indicarle a Spring que es una clase DAO, y en este caso utilizamos la annotation @PersistenceContext para inyectar el objeto EntityManager que es el que nos permite lanzar querys en JPL. Esta annotation sólo vale para JPA.
4) Implementamos la interfaz con las operaciones de la lógica de negocio
Esta interfaz es común al resto de los ejemplos y tampoco hace que la explique mucho así qeu no me enrollo.
5) Implementamos la interfaz IFacade
Utilizamos la annotation @Service para indicar que es un bean que tiene que manejar Spring y la annotation @Autowired para inyectar la clase DAO, y como no la annotation @Transaction para marcar las transacciones de manera declarativa. 6) Creamos el fichero persistence.xml típico de JPA. Yo he creado una carpeta META-INF bajo la carpeta source, pero este archivo podría ir en cualquier lado.
En este archivo indicamos que el recurso es local, vamos que se encuentra en la propia máquina y le ponemos un nombre a la unidad de persistencia. Este archivo también nos vale para configurar las propiedades del ORM en nuestro caso Hibernate.
7) Archivo de configuración de Spring
En este archivo se definen el DataSource como en los otros casos, la EntityManagerFactory a la que se le inyectan la URL de nuestro fichero de persistencia, el nombre de la unidad de persistencia y los datos asociados a nuestro ORM. Por último configuramos el transaction manager.
Y esto es todo amigos así conseguimos una capa de negocio con 2 xml que no son muy largos y que no habrá que tocar mientras no cambiemos el ORM, el resto del código es programable mediante annotations. La verdad es que me he quedado impresionado con el resultado, la solución es limpia y acaba con todo lo que no me gustaba de Spring. La verdad es que para proyectos grandes la utilizaría sin dudar.
Os dejo una lista de links que me han resultado útiles para realizar este artículo
- http://zenoconsulting.wikidot.
com/blog:8 - http://paulszulc.wordpress.com/2010/01/09/jpa-2-0-and-spring-3-0-with-maven/
- http://www.javacodegeeks.com/2010/05/gwt-2-spring-3-jpa-2-hibernate-35.html
- http://blog.springsource.org/2011/02/10/getting-started-with-spring-data-jpa/
[...] y pequeño posible. Para el estudio he probado con Spring-JDBC, Spring+Mybatis, Spring+Hibernate y Spring+JPA+Hibernate y mis conclusiones son las [...]
Excelente!!
Gracias por la referencia Raul!! En estos momentos estoy montando en Eclipse Indigo plugins para desarrollar con esta architectura y ZK para la vista. Tengo JBoss Tools, maven y ZK Studio, hace falta algun plugin para Spring? Me recomiendas uno para la generacion automatica de Beans y DAO con JPA e Hibernate? Gracias por tu atencion! Saludos desde Venezuela
Buenas Joan,
Spring tiene su propia coleccion de herramientas Spring Roo, yo no las he utilizado nunca y algunos amigos míos las critican bastante. Si trabajas con JPA para los objetos de donminio Eclipse ya te da la posibilidad de generar los objetos de dominio con las anotaciones. No obstante, a mí me han aconsejado MyEclipse, trae plugins para Spring, Hibernate, JSF, vamos un poco de todo y es muy bueno. Creo que la licencia profesional son 10$ al año. Prúebala y ya me dirás.
Un saludo desde España