Primeros pasos con Spring #3, persistencia
La capa de persistencia en Spring es muy sencilla de configurar y en esta ocasión comenzaremos a darle forma , crearemos nuestra primera entidad así como las consultas de buscar, insertar, borrar y actualizar a la base de datos mediante Hibernate y JPA.
Primero que nada debemos crear nuestro modelo de datos, una tabla que se llamara todo la cual tendrá 2 campos id
(clave primaria de tipo entero) y name
(contendrá el nombre como cadena de texto).
Hasta ahora no hemos tocado ni una sola linea de código SQL y no lo haremos, simplemente usaremos nuestro ORM que configuramos anteriormente.
Para ello daremos click derecho en nuestro proyecto y seguiremos con New -> Class
.
Especificaremos el paquete como com.todo.model
y el nombre de nuestra clase sera Todo
y damos click en Finish
.
Agregaremos 2 campos a nuestra clase id y name.
Generaremos el constructor haciendo click derecho en la clase y vamos a Source -> Generate Constructors from Superclass...
.
Presionamos OK
Ahora generaremos el constructor con los campos haciendo click derecho en la clase, vamos a Source -> Generate Constructors using Fields...
.
Damos click en OK
Generamos los getters y setters haciendo click derecho en la clase, vamos a Source -> Generate Getters and Setters...
En la ventana que se abrió seleccionamos las 2 propiedades, damos click en OK
y salvamos con ctrl + shift + s
.
Es necesario sobrescribir los métodos equals y hashCode, mismo procedimiento, click derecho en la clase, vamos a Source -> Generate hashCode() and equals()...
En la ventana seleccionamos las 2 propiedades, damos click en OK
y salvamos con ctrl + shift + s
.
Pasaremos a sobrescribir el método toString, click derecho en la clase, vamos a Source -> Generate toString()...
.
Seleccionamos las 2 propiedades, damos click en OK
y salvamos con ctrl + shift + s
.
Con esto en gran medida estará terminada nuestra clase, pero aun falta agregar las anotaciones que la convertirán en una entidad.
La primera anotación que debemos agregar es @Entity, la cual indica que está clase es una entidad y debe ir arriba de la declaración de nuestra clase.
Si Eclipse nos da un error damos click en la marca del error e importamos la clase javax.persistence.Entity.
La segunda anotación que utilizaremos sera @Id, con ella especificaremos la llave primaria de la entidad y debe ir arriba de el campo id.
La tercera anotación que agregaremos es @GeneratedValue, debe ir arriba del campo id y por debajo de la anotación @Id, para especificar como se generara la llave primaria de la entidad mediante un atributo llamado strategy al que le pasaremos una enumeración de estrategias de generación de llaves primarias que se encuentra en la clase GenerationType.
Nosotros utilizaremos la estrategia de generación IDENTITY,que indica que el proveedor de persistencia debe asignar la clave primaria para la entidad utilizando una columna identity en la base de datos.
Hasta aquí llega nuestro modelo, en resumidas cuentas esto nos creara la tabla todo en la base de datos.
Ahora toca crear una clase DAO(Data Access Object), si no sabes que es un DAO puedes leer esto.
Para crear nuestro DAO daremos click derecho en el proyecto, New -> Class
.
En la ventana que aparece diremos que el paquete será com.todo.dao, el nombre de la clase sera TodoDao y damos click en Finish
.
Primero que nada diremos a Spring que nuestra clase es un servicio mediante la anotación @Service.
También indicaremos que todos los métodos de nuestra clase deben ir dentro de una transacción mediante la anotación @Transactional, la cual debe ir después del la anotacion @Service de Spring .
Ahora necesitamos un EntityManager, que obtendremos mediante la inyección de dependencias con la anotación @PersistenceContext.
Ya que contamos con nuestro EntityManager es hora de crear el método para guardar todos en la base de datos.
Declararemos un método llamado save , que regresa un todo y recibe un todo, se utilizara el método persist del Entitymanager y listo , tenemos creado nuestro primer insert con JPA.
Creamos otro método para que nos regrese una lista con los registros de todos los todo, este método se llamará findAll y no recibe parámetros, obtendremos esta lista mediante una consulta de JPQL.
El proceso a nivel código es sencillo creamos un objeto Query con ayuda del EntityManager y su método createQuery, al que le paso como String una consulta de JPQL y obtenemos el resultado con el método getResultList y simplemente lo retornamos.
Agregaremos un método para buscar por id que se llamará findById, el cual recibe un entero primitivo como parámetro y regresa un todo.
Una vez mas el EntityManager hará el trabajo por nosotros gracias a su método find, pasamos la clase Todo y el valor de la llave primaria del todo que buscamos.
Para actualizar crearemos otro método llamado update que recibirá un todo y regresara un todo.
Aquí utilizaremos el método find nuevamente y settearemos la propiedad name del todo que recibimos como parámetro al todo que encontró el EntityManager y devolvemos el todo que encontramos.
Por ultimo necesitamos el método para borrar registros por id, esté método se llamará deleteById, el cual recibe un entero como parámetro y regresa un todo.
Primero buscaremos el todo a eliminar con el método find del EntityManager, comprobamos que fue encontrado y lo eliminamos de la base de datos con el método remove del EntityManager.
Con esto terminamos la capa de persistencia de nuestra aplicación.
Resumiendo, vimos como trabajar con Eclipse para teclear menos, crear una tabla mediante una entidad, como crear una consulta de JPQL y algunos método básicos de la API del EntityManager.
Esto es muy común cuando se trabaja con JPA, al ser muy repetitivo ya existen alternativas que algunas personas han creado , como implementaciones DAO genéricas para todas nuestras entidades o los CrudRepository de Spring, pero estos temas son mas avanzados y es bueno saber como se trabaja con la API estándar de Java, mas de una vez nos sacara de apuros.
El código del proyecto de Eclipse, hasta este punto, lo podemos descargar aquí.