Tutorial Java Web: JSF + Hibernate + BootsFaces [Parte 5.2: Construyendo la Capa de Persistencia]

Miguel Manjarres
5 min readJun 19, 2020

--

Hola 👋 y bienvenido a la quinta (5.2) parte de este tutorial en el que construiremos nuestra propia aplicación de tareas en JSF. En el tutorial anterior aprendimos a establecer una conexión entre nuestra aplicación y una base de datos MySQL y también pudimos crear nuevos registros en la tabla users a través de Hibernate. El objetivo de este tutorial es terminar de construir el resto de la capa de persistencia, creando clases que implementen los métodos en nuestra interfaz DAORepository, de manera que no tengamos que tener código explícito como el que copiamos a nuestro método main de prueba.

Para empezar, abre el proyecto JSFTutorial en tu IDE Eclipse, y en el paquete de repositories, crea una nueva clase llamada UsuarioRepository (puedes ponerle cualquier nombre a la clase de hecho, pero se recomienda mantener la convención). En la ventana de diálogo que te muestra Eclipse, agrega la interfaz DAORepository y en lugar de la T (que representa la superclase) coloca la clase Usuario, tal que así:

Al terminar, verás que nuestra clase en efecto reemplaza todas las instancias de T por nuestra clase Usuario. En este punto sería buena idea instanciar un logger para que, cuando depuremos nuestra aplicación, nos sea más fácil detectar las razones de posibles fallos. Copia y pega el siguiente código dentro de tu nueva clase Usuario:

El proceso que sigue para implementar los métodos del CRUD es muy parecido en todos los casos, tanto que puedes seguir los mismos pasos y utilizar el mismo molde para todas las funciones tal que así:

  1. Crea una nueva instancia de la clase Session a partir del objeto Factory en nuestro DAORepository
  2. Crea un nuevo objeto Transaction a partir de la nueva sesión
  3. Dentro de un bloque try-catch ejecuta la operación que quieras realizar dentro de la sesión (guardar, borrar, buscar o eliminar)
  4. En el bloque finally del try-catch compromete la transacción y cierra la sesión

Gracias a Lombok, podemos ahorrarnos el cerrar la sesión manualmente con la anotación @Cleanup .

Operación Save (guardar)

Siguiendo los pasos que tenemos arriba, la implementación para el método save sería:

Operación save

Operación Update (actualizar)

Es exactamente igual que la operación guardar, solo cambia el método save() en el objeto session por el método update().

Operación Get All (obtener todos los registros)

Esta operación es un poco especial, pues la clase Session no tiene un método que explícitamente nos devuelva todos los registros, tenemos que decirselo a través de un query, podrías estar tentado a hacerlo con SQL, pero JPA tiene su propio lenguaje de consultas llamado JPQL (Java Persistence Query Language). No es el propósito de este tutorial enseñarte JPQL sin embargo es necesario hablar de él si queremos crear nuestro repositorio. La principal diferencia entre JPQL y SQL es que JPQL funciona en términos de clases, no de tablas, de manera que podemos acceder a las propiedades de un objeto de igual manera que en Java.

En SQL si quisiéramos acceder a todos los registros de la tabla users haríamos algo como lo siguiente:

  • SELECT * FROM users

El equivalente en JPQL sería:

  • SELECT u FROM Usuario u

Observa que en el query creamos una nueva instancia de Usuario u por cada registro de la tabla, Hibernate es lo suficientemente inteligente para saber la tabla a la que la clase Usuario hace referencia.

Luego entonces, en adición a los pasos de arriba, para concretar esta operación debemos:

  1. Crear el query con la función createQuery(q, class) de la clase Session. El primer parámetro es el query en JPQL y el segundo es la clase con la cual él [Hibernate] va a mapear los registros
  2. Ejecutar el query con la función getResultList() que devuelve una lista con los resultados del query ejecutado
  3. Devolver la lista

Aplicando esto, nuestra implementación quedaría:

Operación Get By Id (obtener usuario por id)

Similar al caso anterior, no disponemos de un método que explícitamente haga esto por nosotros, por lo que deberemos armar el query nosotros mismos.

En SQL haríamos algo como esto:

  • SELECT * FROM users WHERE users.id = <id>

Pero en JPQL recuerda que pensamos en términos de objetos, no de tablas, por lo que el equivalente de la sentencia anterior sería:

  • SELECT u FROM Usuario u WHERE u.id = :<id>

Donde :<id> es un parámetro que nosotros pasamos al momento de crear el query.

Los pasos son los mismos que en el ejemplo anterior pero teniendo en cuenta lo siguiente:

  • Llamaremos al método getSingleResult() en vez del método anterior puesto que solo esperamos que la consulta nos devuelva un único elemento, recordemos que el id debe ser único
  • Aunque podemos devolver el objeto Usuario de una vez, es posible que el registro que estemos buscando no exista, ocasionando que la función devuelva null. Para evitar esto, hacemos uso de una estructura de datos llamada Optional implementada en el paquete java.util a partir de la versión 8

Aplicando esto, nuestra implementación quedaría:

Operación Delete (borrado)

Esta método sigue la misma fórmula que los dos primeros con la diferencia de que antes de llamar al método delete() debemos recuperar el registro, para ello podemos utilizar el método getById() que acabamos de implementar, tal que así:

Aquí está el código de la clase completa (siéntete libre de copiar y pegar esto en tu proyecto):

El proceso para construir el repositorio para la clase Tarea es exactamente igual, por ello te invito a realizarlo por ti mismo.

¡Felicidades 🥳! con esto has finalizado satisfactoriamente la construcción de la capa de persistencia de datos, hemos progresado bastante y nuestra aplicación ya está tomando forma, en el próximo tutorial avanzaremos con la capa de servicios y tranquilo, prometo que no será tan extenso como esta sección. Muchas gracias por leer hasta aquí y espero verte en una próxima ocasión.

Si te gustó el tutorial y quieres apoyarme para seguir creando más contenido así puedes hacerme una donación aquí.

Tutorial anterior: https://medium.com/@devtony101/tutorial-java-web-jsf-hibernate-bootsfaces-52604149345b

Tutorial siguiente: https://medium.com/@devtony101/tutorial-java-web-jsf-hibernate-bootsfaces-7031bec19abc

--

--

Miguel Manjarres

Ingeniero de Software con experiencia en desarrollo de aplicaciones web y de escritorio