¿Cómo eliminar un elemento de la base de datos utilizando Crude Repository en Spring?
Eliminar un elemento de la base de datos es una operación básica pero fundamental en cualquier aplicación. Spring Framework facilita este proceso a través de su Crude Repository, ofreciendo métodos intuitivos y directos para gestionar datos con eficacia. Vamos a explorar cómo puedes eliminar un elemento, en este caso una "pixa", utilizando Spring y su Crude Repository.
¿Qué es Crude Repository y cómo ayuda en la eliminación?
Crude Repository es una interfaz que define operaciones básicas para crear, leer, actualizar y eliminar datos en la base de datos, conocidas como operaciones CRUD (por sus siglas en inglés: Create, Read, Update, Delete). Ya hemos explorado cómo leer y guardar datos con el método save, pero ahora nos enfocaremos en la operación de eliminación.
¿Cómo se implementa un método de eliminación?
Para eliminar una "pixa" por su identificador único, implementaremos un método que no retorna nada. Este método utilizará deleteById, un método proporcionado por Crude Repository específicamente para borrar elementos a partir de su clave primaria.
Este método toma como parámetro el ID de la "pixa" y llama al deleteById, el cual se encarga de toda la lógica de eliminación.
¿Cómo se crea un endpoint para eliminar una entrada?
En el controlador de la aplicación, debemos definir el endpoint que permita recibir peticiones de eliminación. Utilizaremos DeleteMapping para asociar el endpoint HTTP DELETE.
Verificación de existencia: Utilizamos un método exist antes de intentar eliminar la pixa, asegurándonos de que efectivamente existe.
Manejo de respuestas: Retornamos un ResponseEntity vacío con un estado 200 si la eliminación fue exitosa, o un estado 400 si no se pudo realizar.
¿Qué sucede detrás de escena al eliminar un elemento?
Cuando envías una petición para eliminar una "pixa", se piensa comúnmente que es eliminado de manera directa. Sin embargo, bajo el capó, ocurre más:
Verificación inicial con select count: Se ejecuta primero este comando para confirmar la existencia del elemento.
Ejecución de eliminación: Solo después de verificar la existencia, se procede a ejecutar la operación de eliminación con el método deleteById transformado en un comando SQL por Hibernate.
¿Cómo verificar que una "pixa" ha sido eliminada?
Después de realizar la operación DELETE, puedes verificar que el elemento ha sido eliminado mediante una consulta GET al servicio:
// Método en el servicio para obtener una pixapublicPixagetById(int idPixa){returnthis.pixaRepository.findById(idPixa).orElse(null);}
Al realizar una petición GET y no obtener respuesta, puedes confirmar que el elemento ya no está en la base de datos.
El poder de Spring Data Repositories radica en su capacidad para simplificar la interacción con la base de datos, relegando al desarrollador a simplemente implementar los métodos necesarios y dejar que Framework maneje el resto. ¡Sigue explorando y aprendiendo! En la próxima lección, veremos cómo gestionar las relaciones en la base de datos con Lazy y Eager.
Eliminar elementos con Spring Data JPA: método deleteById
Eliminar elementos con Spring Data JPA: método deleteById
Recursos
Resumen
¿Cómo eliminar un elemento de la base de datos utilizando Crude Repository en Spring?
Eliminar un elemento de la base de datos es una operación básica pero fundamental en cualquier aplicación. Spring Framework facilita este proceso a través de su Crude Repository, ofreciendo métodos intuitivos y directos para gestionar datos con eficacia. Vamos a explorar cómo puedes eliminar un elemento, en este caso una "pixa", utilizando Spring y su Crude Repository.
¿Qué es Crude Repository y cómo ayuda en la eliminación?
Crude Repository es una interfaz que define operaciones básicas para crear, leer, actualizar y eliminar datos en la base de datos, conocidas como operaciones CRUD (por sus siglas en inglés: Create, Read, Update, Delete). Ya hemos explorado cómo leer y guardar datos con el método save, pero ahora nos enfocaremos en la operación de eliminación.
¿Cómo se implementa un método de eliminación?
Para eliminar una "pixa" por su identificador único, implementaremos un método que no retorna nada. Este método utilizará deleteById, un método proporcionado por Crude Repository específicamente para borrar elementos a partir de su clave primaria.
public void delete(int idPixa) {
this.pixaRepository.deleteById(idPixa);
}
Este método toma como parámetro el ID de la "pixa" y llama al deleteById, el cual se encarga de toda la lógica de eliminación.
¿Cómo se crea un endpoint para eliminar una entrada?
En el controlador de la aplicación, debemos definir el endpoint que permita recibir peticiones de eliminación. Utilizaremos DeleteMapping para asociar el endpoint HTTP DELETE.
@DeleteMapping("/pixas/{id}")
public ResponseEntity<Void> deletePixa(@PathVariable int id) {
if (this.pixaService.exist(id)) {
this.pixaService.delete(id);
return ResponseEntity.ok().build();
} else {
return ResponseEntity.badRequest().build();
}
}
Verificación de existencia: Utilizamos un método exist antes de intentar eliminar la pixa, asegurándonos de que efectivamente existe.
Manejo de respuestas: Retornamos un ResponseEntity vacío con un estado 200 si la eliminación fue exitosa, o un estado 400 si no se pudo realizar.
¿Qué sucede detrás de escena al eliminar un elemento?
Cuando envías una petición para eliminar una "pixa", se piensa comúnmente que es eliminado de manera directa. Sin embargo, bajo el capó, ocurre más:
Verificación inicial con select count: Se ejecuta primero este comando para confirmar la existencia del elemento.
Ejecución de eliminación: Solo después de verificar la existencia, se procede a ejecutar la operación de eliminación con el método deleteById transformado en un comando SQL por Hibernate.
¿Cómo verificar que una "pixa" ha sido eliminada?
Después de realizar la operación DELETE, puedes verificar que el elemento ha sido eliminado mediante una consulta GET al servicio:
// Método en el servicio para obtener una pixa
public Pixa getById(int idPixa) {
return this.pixaRepository.findById(idPixa).orElse(null);
}
Al realizar una petición GET y no obtener respuesta, puedes confirmar que el elemento ya no está en la base de datos.
El poder de Spring Data Repositories radica en su capacidad para simplificar la interacción con la base de datos, relegando al desarrollador a simplemente implementar los métodos necesarios y dejar que Framework maneje el resto. ¡Sigue explorando y aprendiendo! En la próxima lección, veremos cómo gestionar las relaciones en la base de datos con Lazy y Eager.
Hoy en día, ningún registro se debe de eliminar en una base de datos, en lugar de desaparecerlo, debemos "desactivar el registro", es decir, hacer que ya no aparezca en nuestra consulta o que ya no tenga las funcionalidades que tenía en la base de datos. Es una mejor práctica.
El metodo delete ya hace un select para verificar si existe o no el registro. Al hacer un if exist estamos duplicando la cantidad de verficaciones y aumentando las consultas a la BD.
No mejor usar try-catch para validar si hubo algun tipo de error al eliminar y manejar la validación desde el error en el Service?
propongo este manejo, para el Service
public boolean delete(int idPizza) {
try {
this.pizzaRepository.deleteById(idPizza);
return true;
} catch (Exception e) {
return false;
}
}
```Para el controller
```js
@DeleteMapping("/{idPizza}")
public ResponseEntity<Void> delete(@PathVariable int idPizza) {
return (this.pizzaService.delete(idPizza))
? ResponseEntity.ok().build()
: ResponseEntity.badRequest().build();
}
Continuando con las buenas practicas (try-catch, http-notfound)
@DeleteMapping("/{idPizza}")publicResponseEntity<?>delete(@PathVariable int idPizza){try{if(this.pizzaService.exists(idPizza)){this.pizzaService.delete(idPizza);returnResponseEntity.ok().build();}returnResponseEntity.status(HttpStatus.NOT_FOUND).body("La Pizza no Existe!");}catch(Exception e){ log.error(e.getMessage());returnResponseEntity.internalServerError().build();}}
Hola, una pregunta, ¿en qué situación el catch arrojaría la excepción?
Hola, te podría devolver una excepción en el caso que el servidor no te responda (un timeout), o que no tengas autorización para realizar esa petición, o que le estes enviando una petición incorrecta.
Hoy en día, ningún registro se debe de eliminar en una base de datos, en lugar de desaparecerlo, debemos "desactivar el registro", es decir, hacer que ya no aparezca en nuestra consulta o que ya no tenga las funcionalidades que tenía en la base de datos. Es una mejor práctica.
De acuerdo!
ayer, hoy y siempre nunca es bueno eliminar unr egistro por completo de una DB
hay matices y casos puntuales como en todo, pero la regla siempre sera no borrarlos sino "desactivarlos", normalmente con una columna deleted_at
Estimado profe, puede hacer algún curso donde se haga reportes en PDF desde el backend?
Para no tener doble return:
@DeleteMapping("/{id}")publicResponseEntity<Void>delete(@PathVariable int id){ResponseEntity<Void> responseEntity =ResponseEntity.notFound().build();if(this.pizzaService.exists(id)){this.pizzaService.delete(id); responseEntity =ResponseEntity.ok().build();}return responseEntity;}
✨ Detalles ✨
El metodo delete ya hace un select para verificar si existe o no el registro. Al hacer un if exist estamos duplicando la cantidad de verficaciones y aumentando las consultas a la BD.
No mejor usar try-catch para validar si hubo algun tipo de error al eliminar y manejar la validación desde el error en el Service?
propongo este manejo, para el Service
public boolean delete(int idPizza){try{this.pizzaRepository.deleteById(idPizza);returntrue;}catch(Exception e){returnfalse;}}```Para el controller
```js
@DeleteMapping("/{idPizza}")publicResponseEntity<Void>delete(@PathVariable int idPizza){return(this.pizzaService.delete(idPizza))?ResponseEntity.ok().build():ResponseEntity.badRequest().build();}
Yo realice el proceso de eliminar asi (se que faltan excepciones y eso)
Service:
public boolean delete(int idPizza){if(exists(idPizza)){this.pizzaRepository.deleteById(idPizza);returntrue;}returnfalse;}
Controller:
@DeleteMapping("/{idPizza}")publicResponseEntity<String>delete(@PathVariable(name ="idPizza") int idPizza){if(this.pizzaService.delete(idPizza)){returnResponseEntity.ok("Pizza with ID: "+ idPizza +" Deleted");}returnResponseEntity.notFound().build();}
✅
No seria mejor que en el endpoint de get pizzas lanzar un error 404 Not Found sino se encuentra la pizza, en lugar de retornar algo ok y vacio
Te recuerdo que acá no tenemos muy en cuenta todas esas validaciones porque nos enfocamos especialmente en Spring JPA. Pero puedes hacerlo y queda muucho mejor!
Yo he hecho eso al ver tu recomendación, queda mejor sí :thumbsup:
@GetMapping("/{idPizza}")publicResponseEntity<PizzaEntity>get(@PathVariable int idPizza){returnthis.pizzaService.exists(idPizza)?ResponseEntity.ok(this.pizzaService.get(idPizza)):ResponseEntity.notFound().build();}
Venia trabajando de lo mas bien, apague la pc, y luego cuando retome estoy con este problema, y no se como solucionarlo,,alguin poderia ayudarme?