sábado, 5 de marzo de 2011

Integración de JSF-Spring-Hibernate(JPA)



Hace algunos días en el proyecto hermano de evangelización Java: Profesor Java dicté una conferencia sobre la integración de los frameworks: JSF, Spring y Hibernate, y agradezco mucho la tremenda buena onda que me brindó la comunidad que asistió desde países como: Argentina, México, Colombia, El Salvador, Ecuador, Perú, etc. con lo cual es gratificante corroborar que sí es posible generar proyectos latinoamericanos con filosofía colaborativa. Muchas gracias a todos los que asistieron y para aquellas personas que no pudieron asistir y que me han pedido que escriba un post con los contenidos del curso, aquí lo tienen y que espero sea de utilidad pues lo repito, ESTAMOS AQUÍ PARA DARNOS UNA MANO ;)

La arquitectura empleada en el ejemplo que desarrollamos es una arquitectura dividida en capas:


Como es notorio, empleamos éste modelo arquitectural por ser un modelo que impulsa un desarrollo bien hecho, y con el cual obtenemos grandes beneficios como:

1) Una clara separación entre capas para delegar funcionalidades específicas en cada una y con ésto evitar tener un código altamente cohesionado y "spaghettizado" (Real academia de la lengua ahí tienen una nueva palabra castellanizada por mi a la fuerza jejeje).

2) Hacer de nuestra aplicación una aplicación escalabe, es decir si en algún punto en el ciclo de vida de nuestra aplicación surge la necesidad de migrara hacia nuevas tecnologías, podremos hacerlo facilmente con una "visión lego" (mírese la imagen) en la cual simplemente retiramos la pieza que no necesitamos, para sustituirla por una nueva que se acople a nuestras necesidades; por ejemplo en la arquitectura antes mencionada podríamos migrar en la capa de vista sustituyendo el "lego de JSF" por "lego de Flex" sin necesidad de modificar el código restante de las otras capas, así mismo, empleando el mismo ejemplo podríamos migrar tanto en la capa de Lógica de Negocio de Spring a EJB o en la capa de acceso a datos de Hibernate a TopLink (sin que ésto afecte significativamente al resto de capas y mas que nada al código con el que ya contamos, claro serán necesarias ciertas modificaciones pero que son insignificantes en comparación a los cambios que seran necesarios al migrar una aplicación que no esta hecha bajo esta perspectiva arquitectural de división por capas).

Teniendo en claro el escenario en el cual nos desarrollaremos, empecemos detallando el ejemplo que se desarrolló en el curso:
Nuestro objetivo es generar una aplicación web que corra bajo algún servidor web como Tomcat, Glassfish, Jboss...etc y que interactúe con una base de datos (para este caso MySQL) sobre la cual haremos inserciones, recuperación y despliegue de la información ingresada, ésto a través de los framework: JSF-Spring-Hibernate(JPA) . A continuación una imagen de como luce la interfaz general:



1)Como primer paso creamos la base de datos "frameworks" (vacía) pues usando el potencial de hibernate generaremos las tablas de manera automática.
2)Creamos el archivo de configuración de Hibernate:



3) Hacemos una referencia a Hibernate en el archivo de configuracion de Spring.



4) Creamos la Entidad Persona (hacemos uso de las anotaciones de JPA). Nota: la implementación de la Interface Serializable es necesaria para una entidad que será persisitida como registro de una base de datos.



5) Generamos automáticamente las tablas de la base de datos (añadiendo el mapeo de la entidades en el archivo de configuración de Hibernate).

6) Creamos la Interface PersonaDAO donde mencionamos las características funcionales de inserción y recuperación de registros en la base de datos.



7) Creamos la implementación de la Interfase PersonaDAO, aquí desarrollamos la lógica de negocio en sí de la aplicación (nótese porqué Spring es nuestro aliado en ésto).



8) En el archivo de configuracion de Spring hacemos referencia al bean que implementa a PersonaDAO. Nota: Spring es un bean-factory.



9) Generamos nuestros Backing Beans (para soporte a JSF). Aquí se incluye otro concepto importantísimo de Spring (Inyeccion de dependencia: DI).



10) Generamos nuestro archivo de configuracion de JSF. Nota: podría incluso obviarse el uso de este archivo mediante el uso de anotaciones pero para éste caso decidí mostrar gran parte desarrollada "a mano" desde cero. Para próximos posts podría incluir estas nuevas características orientadas a anotaciones de la plataforma EE.



11) Creamos nuestras páginas JSF.



12) Probamos la aplicacion en algún Servidor Web Java.

El codigo de la aplicacion (Proyecto en Eclipse) puede ser descargado desde aquí.
Librerías aquí

Las diapositivas del curso pueden descargarse desde aquí.

CONCLUSIÓN.

Frameworks ligeros como Hibernate o Spring han sido tremendamente usados por haber emergido como una solución seria ante los "huecos" que la plataforma EE presentaba hace algunos años. Hablando de Hibernate, es una solución tan robusta que incluso ha servido de base para crear nuevas características standares en la plataforma EE actual (en su modelo de persistencia) y si hablamos de Spring, es un framework que cada día crece exponencialmente pues aparte de las características que lo hicieron famoso: Dependency Injection e Inversion of Control (siendo un Bean Factory), ahora brinda una gran variedad de funcionalidades en forma de módulos como: Spring Security, Spring AOP, Spring MVC, etc. por lo cual se ha convertido en la seria competencia a EJB, por tal motivo tanto Spring como Hibernate son dos opciones muy fiables que deben ser tomadas en cuenta por los arquitectos de desarrollo a la hora de implementar soluciones web Java.

NOTA: Por mencionar un ejemplo del uso de estos frameworks, la red social hi5 usa Spring dentro de su arquitectura.

36 comentarios:

martosfre dijo...

Muy buen post, Santy. Felicitaciones, sigue adelante.

Un abrazo

Sadoc dijo...

Muy buen post, Sr. Santiago... lastima que me perdi el curos

Φ♠ HßM§ ƆhØmA§Φ♠ dijo...

Muy bueno el curso profe tanto q aun lo recuerdo..saludos desde machala buen aporte aguante la evangelización java!

saito dijo...

Gracias por el aporte Santiago, la verdad es que como hemos hablado debemos preocuparnos por hacer que latinoamerica comparta el conocimiento que tiene con mucha gente capaz que no tiene nada que envidiarle a otros paises que son potencias mundiales...

Sigamos adelante....

Anónimo dijo...

Buen aporte, Felicitaciones!!!! que siga el compartir de conocimientos Java.

Saludos.

Unknown dijo...

Significativo aporte sobre todo para aquellos que nos gusta java, gracias Santiago :)

Anónimo dijo...

Muy buen aporte, saludos desde Chile..


Marco Diaz V.

Anónimo dijo...

Caramba Santiago, que clase!!! me ha gustado muchísimo. Estoy pasando el link de tu blog a mas interesados. Sigue!!!! Saludos desde Perú! :)

Josymar de Leon dijo...

Hola excelente post. He estado buscando en la web un tutorial pero usando JSF y JPA, sabes como puedo hacer la integracion con estas dos tecnologias? El uso de JSF sea con anotaciones y no creando archivos XML

Santiago Tapia dijo...

Hola Jossimar, te sugiero que mires mi último post en el cual cumple totalmente tus requierimientos:
integra jsf (con anotaciones) con JPA (con hibernate como persistence provider). El link:

http://santiagotapiay.blogspot.com/2011/04/integracion-de-jsfprimefaces-y.html

Kishiro dijo...

Hola Santiago, muy bueno tu post mas bien quería pedirte un favor, no tendrás el mismo ejemplo pero con netbeans lo q pasa es que soy nuevo en los framework web, y ademas siempre trabajo con Netbeans gracias

Santiago Tapia dijo...

Hola Kishiro. No lo tengo en Netbeans pero como lo he dicho siempre, el IDE es lo de menos, así que pasarlo a Netbeans no es nada complicado, simplemente has una aplicación web y ve copiando todos los archivos que he incluido en la descarga, debería funcionar sin ningún lio. Saludos.

freddy dijo...

Hola santiago: Muy interesante tu post. Yo eh programado en struts e hibernate, y ahora estoy entrando a desarrollar bajo las 3 capas que has expuesto, te agradeceria si es que me pudieras facilitar un ejemplo de mantenimiento. Eres un capo y si tienes otra exposicion de hecho estoy ahi Gracias.

freddy dijo...

Tengo una duda, trate de correr el ejemplo pero me bota un error:

org.springframework.beans.factory.BeanCreationException:

Supongo debe ser una biblioteca que falta agregar, pero no se cual, podria decirme la lista de bibliotecas que debo importar para que funcione el ejemplo.

Muchas gracias

Santiago Tapia dijo...

Hola Freddy, te está faltando librerias. Ve a http://santiagotapiay.site88.net/ en la seccion descargas tengo todas las librerías necesarias para el ejemplo ;)

freddy dijo...

Que tal santi!!!! gracias por toda la ayuda que me diste para entender este ejercicio. Pero te comento que tuve problemas al usarlo con oracle, podrias postear el mismo ejercicio pero usando oracle??? al parecer hay un error cuando creo la entity, no reconoce las variables tipo NUMBER. Espero pueda resolverme esa duda y que el ejemplo tenga campos del tipo NUMBER al crear la tabla de la BD.

Santiago Tapia dijo...

Hola Freddy, toma muy en cuenta la estrategia de generación, es decir el GenerationType de la línea:

@GeneratedValue(strategy=GenerationType.AUTO)

Ahí tienes la solución ;)

Angel Holberg dijo...

Muy buen tutorial, felicidades, ahora si no estanto pedir me gustaria explicaras a grandes o detalladamente que jars son de cada framework y para que sirven spring, jsf, hibernate ya que segui al pie de la letra tu ejemplo y me funciono a la primera pero ahora trato de separar cada uno de los frameworks y no logro obtener un resultado, gracias.

Santiago Tapia dijo...

Hola Angel. Gracias por leer el blog. 1) Para darte cuenta qué jars pertenecen a cada framework, te sugiero que te decargues cada framework por separado (jsf, spring e hibernate), usualmente en la documentación te mencionan los jars que requiere cada framework e incluso tendras librerías más actualizadas de ser el caso.
2)Para separar los frameworks, te sugiero que revises mi post de integración de jsf con hiberante, ahí te daras cuenta como trabaja el mismo ejemplo pero sin Spring. Y para aprender a usar cada uno de los frameworks por separado, usa una herramienta que te ayude a hacerlo, por ejemplo netbeans, donde hay esa opción. Avísame cualquier duda.

noe dijo...

Muy buen post, bueno soy un poco novato en esto del manejo de frameworks, justamente staba buscando algun ejemplo o info q integrara a estos frames. Gracias. Felicidads x el curso... spero q aya alguno x aka por Peru

Anónimo dijo...

Tu trabajo me ha ayudado muchísimo. Gracias por compartir tus conocimientos con todo el mundo. Saludos desde España!!

CarracedO dijo...

hola a todos!!!
una preguntita a ver si alguien sabe responderme....porque algo debo estar haciendo mal cuando no me funciona :(. yo doy los siguientes pasos:

1.- abro eclipse indigo recien descargado.
2.- importo el proyecto de santiago a mi workspace, meto las librerias en resources/libraries y me queda así: http://img546.imageshack.us/img546/8391/capt1.jpg
3.-soluciono el problema del classpath, soluciono el problema del target runtime creandome un t7 q es el que tengo y quitando ese en el target runtime del proyecto, soluciono los html problem cambiando FIELDSET por fieldset y me queda la cosa asi: http://img41.imageshack.us/img41/4628/capt2b.jpg
4.- y aquí es donde empiezo a perderme. he buscado soluciones en google pero ninguna me ha funcionado :(. Alguna idea?

Santiago Tapia dijo...

Hola CarracedO, gracias por leer mi blog, si quieres añademe al msn y ahi hacemos el ejemplo paso a paso y solucionamos tu problema. Santiago_tapiasr@hotmail.com

Andrea Moncada dijo...

Santiago, me parece muy bueno tu post. Pero tengo un problema y es que cuando hago click en guardar no se ejecuta ninguna acción y me sale una excepción como si no encontrará el archivo hibernate.cfg.xml...Te agradeceria mucho si me pudieras ayudar ya que ando un poco atrasado con mi trabajo de grado.

De antemano muchas gracias Santiago

Santiago Tapia dijo...

Hola andrea, gracias por leer el blog. En mi perfil del blog estan mis datos, añademe al msn y podemos revisar tu problema. Saludos

jose dijo...

Gracias por la entrada, me ha servido de mucha ayuda.
Podrias volver a subir el código, ya que el enlace esta caido.
Gracias

Santiago Tapia dijo...

Hola jose, gracias por tu comentario, y a tu pedido ya actualicé el link de las librerías, espero te sirva.

Jesús Viruez dijo...

podrias resubir las librerias??

JAVAMAN dijo...

Que tal doc un favor podrías compartir las librerías (.jars), ya que el link esta roto.

Gracias.

Santiago Tapia dijo...

Saludos viruten y JAVAMAN, he actualizado las librerias como tres veces, PERO el respositorio GRATUITO que tengo hace que los archivos que subo ahi tengan una fecha de caducidad, defintivamente tengo que buscar otro medio para almacenar archivos, probablemente sea momento de ir por un servicio pagado, pero hasta tanto comuniquense conmigo (en mi perfil esta mi correo) y veamos como les hago llegar las librerias, Un abrazo y gracias por leer el blog
.

Anónimo dijo...

Me parece que tu ejemplo se orienta mas al uso de los frameworks que al diseño desacoplado de la misma, mira tus BakingBeans deberían aislarse de la capa modelo, este es un componente intrinseco de una capa externa, considera un paquetes de controladores de vista o algo parecido, y otras cosas como el incompleto uso de las anotaciones y detalles de buenas practicas, de todas formas es un util aporte, saludos amigo

Santiago Tapia dijo...

Saludos "Anónimo"; gracias por leer el artículo y aportar pero si crees que algo hace falta al artículo podrías darte el tiempo de hacer uno tu pa contribuir ocn la comunidad. Abrazos.

juancupa dijo...

Buenas !.......
Muy bueno su aporte me parece interesante e comprendido algunos pasos que estaba confundido

mi duda son las librerías

gracias Saludos

Anónimo dijo...

muy buen materia

Anónimo dijo...

Hola y donde quedaron los servicios, controladores y demas, andaba buscando un flujo con spring+hibernate+jsf

Santiago Tapia dijo...

Saludos "Anónimo", gracias por tu comentario pero el ejemplo no irá mas alla de donde lo vez, así quye te toco implementar a ti mismo lo que requieres. Un abrazo