Modelar un Negocio en Spring Boot y Hibernate — Parte I
La capa de datos
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 clasePersonaPuesto
, si tenemos el campofecha_nacimiento
será mapeada al atributofechaNacimiento
.
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!