Modelar un Negocio en Spring Boot y Hibernate — Parte I

La capa de datos

Alan Badillo Salas
Full Stack Java
5 min readAug 28, 2018

--

Al modelar un negocio debemos tomar en cuenta cinco capas importantes que nos van a ayudar a organizar correctamente nuestro proyecto. Estas capas nos van a permitir ubicar rápidamente las entidades que realizan una función específica en nuestro sistema, como definir las estructuras de datos, realizar consultas a la base de datos, proveer métodos seguros para validar los datos antes de enviarlos a la base de datos, proveer un acceso a los servicios a tráves de un API REST y consumir nuestros datos mediante interfaces WEB. Cada una de las funciones descritas anteriormente corresponde a una de las Capas de Negocio que revisaremos a continuación a lo largo de estas entregas.

Capa de Datos

La primer capa se refiere a los datos en nuestro sistema, es decir, la representación de las entidades a nivel código. En la capa de datos estaremos modelando entidades DTO (Data Transactional Object), las cuales nos ayudarán a transportar los datos en las transacciones entre el sistema, la base de datos y los clientes web.

Definición de la Clase POJO

En esta capa se deben especificar clases POJO (Plain-Old Java Object) las cuales son clases simples que se componen de atributos, getters, setters y posiblemente constructores, pero en ningún momento implementan métodos funcionales. Las clases POJO nos permiten retener datos de entidades y poder transportarlas fácilmente (son fáciles de serializar/deserializar).

Veamos un ejemplo de la clase Cupcake la cual retiene la información necesaria de un Cupcake para un negocio de venta de pastelillos en línea.

Lo primero será crear un paquete llamado com.miempresa.dto en dicho paquete vamos a guardar todas nuestras clases POJO referentes a la capa de datos. En el siguiente código podemos observar a la clase Cupcake.java definida con los atributos id, nombre y costo con los tipos de datos Integer, String y Float. Observa que utilizamos Integer en lugar de int y Float en lugar de float, esto es así para permitir retener el valor que provenga de una base de datos y también valores nulos (null).

Importante: No olvides crear el paquete com.miempresa.dto ya que sin este tu código va a quedar desorganizado y tus clases revueltas, además si no escribes bien el nombre del paquete, Spring Boot no será capaz de encontrar tus clases al momento de aplicar las anotaciones.

Finalmente debemos recordar que podemos generar todos los getters y setters automáticamente dando clic secundario y luego en Source>Generate Getters and Setters.

El resultado será una clase POJO con sus atributos, getters y setters.

Convertir una Clase POJO en una Entidad de Hibernate

Las clases POJO definidas como antes nos permiten retener la información de una entidad, en el ejemplo anterior, la información de un cupcake o panque. Sin embargo, si queremos expresar una relación entre un Cupcake de nuestra base de datos y un Cupcake de nuestro sistema, podemos utilizar las anotaciones de Hibernate, para indicarle a nuestra clase POJO que puede ser mapeada directamente a una tabla con los mismos atributos y nombres.

Hibernate utiliza una convención de nombres la cual indica una estrategia para establecer la relación entre el nombre en nuestra clase y el nombre en la base de datos, por ejemplo, si en la base de datos tenemos la tabla persona_puesto será mapeada a la clase PersonaPuesto, si tenemos el campo fecha_nacimiento será mapeada al atributo fechaNacimiento.

Lo primero que debemos hacer añadir la anotación Entity a nivel clase junto a la anotación Table(name="cupcakes"). Esto le permitirá a Hibernate mapear nuestra clase POJO a una tabla cupcakes de MySQL, si no existe la crea y si ya existe la utiliza. Observa que importamos javax.persistence.* para poder utilizar la anotación.

Una anotación es un marcado que se le aplica a una Clase, Atributo, Método o Parámetro de un Método para poder modificar y extender su funcionalidad rápidamente. Previo a las anotaciones, teníamos que definir extensos archivos XML dónde se indicaba la configuración especial. Ahora simplemente marcamos los elementos con anotaciones y podemos disponer de la configuración automática que proveen los frameworks como Spring y Hibernate.

Lo siguiente es establecer cuál será el campo que funcione como ID para nuestra entidad. En este caso será id, por lo cual marcaremos dicho campo con la anotación Id igualmente de javax.persistence.

Ahora si ejecutamos nuestro proyecto, veremos que Hibernate ejecuta el query create table cupcakes ... para crear la tabla cupcakes porque no existia, en futuras ejecuciones ya no ejecutará esta consulta ya que la tabla ya existirá.

Conclusiones

La capa de datos mejor conocida como DTO nos permite definir las entidades del sistema mediante clases POJO marcadas con las anotaciones Entity, Table y Id para establecer una relación entre una entidad de nuestro sistema y una tabla de la base de datos.

Toda entidad en nuestro negocio debería tener una tabla en nuestra base de datos y viceversa, toda tabla en nuestra base de datos, debería tener una entidad en nuestro proyecto. Esto es una buena práctica para conocer todos los entes que residen en nuestro sistema y poder interactuar a nivel código con cada uno de ellos. Más adelante hablaremos sobre el correcto modelado de tablas en MySQL para detectar las entidades fuertes y débiles y sus relaciones.

Todas los componentes para la Capa de Datos deberían ser Clases POJO marcadas con Entity dentro del paquete com.miempresa.dto. Es importante comprender la relación directa entre una tabla de nuestra base de datos y una entidad en nuestro sistema.

Las entidades o DTOs sirven para transmitir datos en nuestro sistema mediante transacciones que acarren nuestras entidades de una operación a otra sin perder la integridad entre los datos.

Otra buena práctica es marcar las clases con el sufijo DTO para recordar su significado, así la clase Cupcake quedaría como CupcakeDTO.

Envía tus comentarios sobre las dudas que tengas sobre esta capa para ampliar está entrega y no olvides visitar la siguiente capa llamada la Capa de Acceso a Datos. ¡Hasta la próxima!

--

--

Alan Badillo Salas
Full Stack Java

L. Matemáticas Aplicadas UAM-Cuajimalpa. M. en Inteligencia Artificial IPN-CIDETEC. Desarrollador Full Stack MEAN/MERN. Data Scientist.