Spring, Hibernate y Annotations
21-02-2012
Raul Vicente
Clasificado como:
2012 ,
DESARROLLO DE SOFTWARE ,
Eclipse ,
Hibernate ,
Inyección de dependencias ,
JAVA ,
PATRONES DE DISEÑO ,
Spring Framework ,
WEBDEV ,
persistencia en java
Hace poco escribí unos artículos obre como realizar una logíca de negocio con Spring-JDBC y Spring+Mybatis con un XML mínimo. Como me parecía que era dejar un poco cojo el tema y animado por Luis he decidido hacer una comparativa de la integración de Spring 3 con los diferentes ORM’s. En este caso voy a realizar un artículo sobre la integración con Hibernate, uno de los ORM’s que más conocidos sino es el más de los úlitmos años.
Mi relación con Hibernate siempre ha sido de amor/odio. Me parecía que tenía grandes ventajas, pero a la vez grandes desventajas y como mis proyectos eran de mediana embergadura siempre me parecía que otras soluciones como Ibatis me eran más útiles. En este caso tengo que decir que me he quedado maravillado con la integración con Spring 3. Ahora que se pueden utilizar annotations y que existen buenas herramientas generadoras de mapeos, es mucho más fácil utilizar Hibernate y el acabado la verdad es que brutal. Como el movimiento se demuestra andando voy a explicar paso a paso como realizar una lógica de negocio con Spring, Hibernate y las annotations de Spring para la lógica de negocio como de JPA para el mapeo de los beans de dominio.
En este caso también voy a utilizar el ejemplo del instituto para que sea más fácil ver las diferencias con Spring-JDBC y Spring+Mybatis.
1) Crear los beans de dominio que mapean las tablas de nuestra BBDD. En este caso para no alargar sólo voy a mapear la tabla Alumnos, pero la de Asignaturas sería igual pero al revés.
Como se puede observar se mapea cada atributo de la clase con una columna de la tabla, como la relación es una M:N se especifica la tabla de relación. De todas maneras hay multitud de herramientas que generan este código utilizando reverse enginering. Así que símplemente hay que quedarse con el concepto. 2)La interfaz del DAO: La interfaz del DAO es igual que la de los 2 ejemplos anteriores:
3) Implementamos el DAO utilizando las Annotations @Repository y @Autowired
En este código cabe destacar que utilizamos @Repository para decirle a Spring que es una clase DAO y que inyectamos el objeto SessionFactory de Hibernate mediante la annotation @Autowired. Por otro lado, cabe destacar que en la función addAlumno() se utiliza el método flush() para forzar a Hibernate a que mueva los datos a la BD en el momento ya que Hibernate sino los inserts y los update los posterga hasta confirmar el commit() lo cual a veces es un problema ya que puede haber claves autonuméricas o simplente estamos realizando un test y como siempre va a hacer rollback() es imposible probarlo bien. 4)La interfaz de la lógica de Negocio
5) Implementamos la interfaz de la lógica de negocio igual que en los otros casos con las annotations @Service para decirle a Spring que es un bean que tiene que manejar, @Autowired para inyectarle las dependencias y @Trasactional para marcar los métodos transaccionales.
6) Archivo configuración de Spring
De este archivo sólo comentar que se crea un objeto DataSource en función a un archivo jdbc.properties que está en la ruta que se especifica en la propiedad context:property-placeholder. Se crea un objeto SessionFactory de Hibernate y se inyecta el DataSource, se le establecen las propiedades de Hibernate que creamos necesarias como el dialect de la base de datos o las propiedades del pool C3P0, por último le indicamos el paquete en el que se encuentran nuestros beans de dominio (Alumno y Asignatura). Por úlitimo se configura el transaction manager como en los ejemplos anteriores.
Y c’est fini. No hay que tocar ni un XML más en todo el ciclo de vida de la aplicación, con las annotatios sería suficiente. La verdad es que ahora sí que merece la pena utilizar estos frameworks y la penalización al desarrollo ya sólo es a nivel de comprensión de conocimientos. La aridez de trabajar con Spring cada vez es menor y el horror de mapear todas las tablas en un XML que era un clásico en Hibernate también ha desaparecido. Gracias a las annotations todos esos errores que se daban en ejecución ahora se pueden controlar en tiempo de ejecución haciéndonos la vida más sencilla
Ahora os dejo una serie de links que me han sido de utilidad:
- http://www.mkyong.com/spring/maven-spring-hibernate-annotation-mysql-example/
- http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/
- http://www.skill-guru.com/blog/2009/10/04/spring-jpa-tutorial-get-hands-on-experience/
- http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/orm/hibernate3/annotation/AnnotationSessionFactoryBean.html
[...] 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 [...]
[...] lo más simple 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 [...]
Hola Raul, estoy utilizando tu ejemplo con un proyecto utilizando Spring MVC Template y me arroja exception de tipo org.hibernate.HibernateException: No Session found for current thread cada vez que intento utilizar el sessionFactory.getCurrentSession()
Si estás utilizando Spring MVC, probablemente no tengas bien configurado el web.xml. Tienes que añadir en un context-param la ruta del archivo applicationContext.xml. Tengo un artículo sobre Spring MVC y con Spring-Jdbc haz un mix y creo que bastará para que te funcione. Si necesitas algo me dices.
La URL del artículo es:
http://www.programania.net/diseno-de-software/spring-mvc-y-annotations/
Bueno el articulo esta muy bueno felicitaciones pero desde hace un tiempo estoy en una incrusijada i haber si usted me saca de esta duda existencial el tema es que no se cual es mejor hibernate o eclipselink y como afecta el jpa en hibernate estuve leyendo por la web y la gente dice que jpa es mejor bueno espero usted con tanta experiencia me pueda ayudar. gracias de antemano espero me pueda ayudar gracias.
A ver Carlos vamos por partes. Primeramente, decirle que no he trabajado con eclipselink así que ahí no puedo juzgar. En lo que ha Hibernate y JPA se refiere, JPA es una API por encima de Hibernate, es decir, necesita por debajo de ORM para funcionar lo que nos garantiza es que nos independiza el código de nuestro ORM. JPA se puede utilizar con Hibernate, con EJB’s o cualquier ORM del mercado. En cuanto si es mejor o peor usarlo, depende del tamaño de la aplicación. Si su aplicación es mediana, a lo mejor es matar moscas a cañonazos pero si es suceptible de ser grande yo apostaría por JPA + Hibernate así aseguraría la independencia de la BD y del ORM. Si está seguro que ni va a cambiar de BD y que un ORM a lo mejor es complicarse mucho porque su aplicación no va a ser tan grande utilice Spring JDBC (tengo otro artículo
) y le será más que suficiente.
Espero haberle ayudado
Un saludo.
Bueno Muchas gracias Raul por tus indicaciones pero algo que no entendí es que si la BD No Cambia no es necesario utilizar un ORM, bueno otra consulta es que donde puedo descargar los ejemplos de tus artículos si se puede, gracias por todo ha y me olvidada no ce si me puedo tomar el atrevimiento sinos podría colaborar con una charla, estamos organizando un evento mas o menos para mediados de noviembre y si podría ser por una vídeo conferencia, de ante mano gracias por todo espero poder contar con su ponencia que seria de gran aporte para nuestro medio informático. Gracias raul.
Buenas Carlos, los ejemplos a priori no están descargables, no obstante, si los encuentro se los puedo enviar. En principio, no cuente con ello porque soy un poco desastre pero haré todo lo que pueda. En efecto, si usted no está pensando en cambiar de BD no necesita un ORM, un ORM a parte de faciliar las consultas a la BD nos independiza de su lenguaje (SQL propido: PL SQL, Transact SQL, etc). Si tiene claro que no va a cambiar de BD puede utilizar Hibernate para aprovecharse de la generación automática de SQL si es que su proyecto va a ser muy grande, yo soy firme defensor de no complicarse la vida utilice Spring+ Spring-JDBC, tengo un artículo escrito también y verá lo cómodo que es. A veces utilizar estas herrmientas si el proyecto no es muy grande y no se va a cambiar la BD es matar moscas a cañonazos.
Un saludo y muchas gracias.
Seria posible que menciones alguna herramienta con la que se pueda generar el bean con las anotaciones? No he encontrado alguna y con el fin de generar el bean con las anotaciones hice uso de JPA, el cual no me genero todas las anotaciones (aun no se por que). Mismo que no debi usar ya que este articulo no lo usa.
Estoy haciendo uso de Spring Tool Suite
Yo no he utilizado el Tool Suite de Spring, pero me han comentado que Spring Roo no es buena opción porque lo que genera no es muy mantenible. Sé que Eclpise si uno genera un proyecto JPA, crea todas los beans de manera cómoda. Se puede utilizar como base y luego cambiar lo que sea necesario para que funcione con Spring.