¿Cómo crear la implementación de nuestro repositorio compra?
Para implementar un repositorio que interactúe con la base de datos en relación a las compras, primero es necesario crear la clase CompraRepository, que implementará el PurchaseRepository. Asegúrate de anotar esta clase como @Repository para que Spring la reconozca como un componente o bean necesario para la comunicación con la base de datos. Entonces, ¿cómo empezamos?
Pasos iniciales para crear el repositorio
Creación de la clase CompraRepository:
Dentro del paquete persistence, crea una nueva clase Java llamada CompraRepository.
Esta clase debe implementar PurchaseRepository.
Anotaciones y configuración:
Asegúrate de anotar la clase con @Repository para que Spring la identifique correctamente.
También es necesario crear una interfaz que extienda CrudRepository llamada CompraCrudRepository.
Interacción con la base de datos
Para poder interactuar adecuadamente, el CompraCrudRepository debe extender de CrudRepository y recibir como parámetros la entidad Compra y su clave primaria, que en este caso es un Integer.
publicinterfaceCompraCrudRepositoryextendsCrudRepository<Compra,Integer>{// Métodos adicionales según el caso}
Luego, debes inyectar esta interfaz en tu CompraRepository junto al mapper necesario:
Para garantizar que la información se guarde en cascada, asegúrate de que la entidad Compra conozca sus productos y viceversa. Implementa el patrón de relaciones cascade y mappedBy en las entidades correspondientes.
Este tutorial se centra en la implementación del repositorio, pero recuerda que aún faltan los servicios y controladores para completar la capa de negocio y presentación. Te animo a desarrollar estos componentes adicionales y compartir tus resultados. Si enfrentas problemas, recuerda que siempre puedes buscar soluciones en el sistema de archivos del curso o las discusiones comunitarias. ¡Sigue adelante con tu aprendizaje!
La verdad me parece muy bueno el curso, pero no se si soy solo yo o es que el hacer todo de un solo sin ir probando paso a paso hace què se màs complicado de entender.
Aveces es bueno ir mostrando los errores o que pasaria si tal anotacion no va o etc... pero en general es bueno el curso.
Totalmente de acuerdo contigo
Consejo sano del curso: cada video compilen y corran su codigo.
Estuvo densa esta clase, me dejo un poco loco la cantidad de vueltas que se da con las relaciones entre las clases y las relaciones de los mapper y las entidades 😵💫.
de acuerdo. Se dan por sobreentendidos muchos temas muy importantes y complejos pero se detienen a explicar cosas bàsicas en las que no se deberìa profundizar. Serìa muy bueno explicar mas a detalle las relaciones entre el dominio y el Repository
Me parece que el video de esta clase esta diferente del audio
Confirmo
Hola, @eriksigcha y @karinadavila😄
Están en lo correcto. El video es de la clase anterior, pero el audio de esta. Vamos a corregirlo. 🙌💚
En mi caso la petición de compras me sacaba error debido a que me indicaba que no era posible convertir el numero de celular por un entero, para esto tuve que cambiar el atributo celular de la entidad Cliente a Long y ya me funciono :)
Hola Cristian, supongo que el error era porque un numero de cel puede desbordar la cantidad de bits que soporta un dato de tipo entero, por buena practicas es mejor usar String para datos que no requieren cálculos matemáticos, teléfonos, número de cédula, etc.
Así como indica Mauricio, solo guarda datos numéricos si vas a hacer cálculos con ellos, de otra manera es mejor el String.
Si les arroja un error al momento de trabajar con la funcion save, específicamente al llamar a getProductos() y en setCompra(compra), es necesario generar los getters y setters en las clases Compras y ComprasProducto.
Estas claes van a mil, como cuando los productores de una serie quieren acabarla inmediatamente, y meten todo en unos pocos capitulos.
😂
A la hora de generar los controllers, y dar respuestas HTTP
Es buena práctica generar 2 posibles respuestas (Efectiva - Negativa) con Try Catch. Así:
Algo así...
De esta manera nos estamos asegurando que en caso de no encontrar respuesta o encontrar respuestas sin contenido podamos manejar errores y mostrarlos en pantalla de una forma más específica y controlada; si me equivoco por favor no duden en corregirme jajaj.
No entendi, la parte de cascadas
significa que todas las entidades que dependen de una entidad que utiliza cascada se veran afectadas si se elimina o actualiza la propiedad que esta relacionada con otras entidades.
por ejemplo si tenemos una entidad Servicio en la que uno de sus atributos contiene una relacion de muchos a uno con una entidad Mecanico, si a ese atributo le indicamos que tenga un comportamiento de cascada, si actualizamos la propiedad Mecanico de Servicios, la entidad Mecanico se vera afectada.
Es mejor injeccion por constructor que por @autowired.
es necesario el @mapsid, no es suficiente con el join column que ya especifca como se resuelve la relacion?
Cuando queremos guardar en cascada debemos poner la anotación @MapsId porque esta anotación es la que proporciona la asignación para una clave primaria cuando se usa @EmbeddedId.
La anotación @JoinColumn solo especifica que columna se relaciona a la hora trabajar con el atributo de la relación.
Pero en ese caso, cuando se quiere hacer la persistencia del objeto ComprasProducto, el mapper solo guardó en el ComprasProductoPK, el id del producto, y el id de la compra la dejo "null", y para complementar esto, es que se hace el for each para llenar el objeto Compra, en Compra Producto
Si en vez de hacer eso, simplemente llenaramos completamente el objeto de ComprasProductoPK con el id de la compra, no habria la necesidad de hacer lo del maps id cierto? que es el caso de cuando se persiste un producto, que no se le pasa el objeto category si no la category id y luego cuando se le hace get, esto ya hace el mapeo y devuelve la category
Siento que está fue la clase mas enredada de todas
Comparto mi código del servicio y controlador.
@ServicepublicclassPurchaseService{ @AutowiredprivatePurchaseRepository purchaseRepository;/**
* Metodo para listar las compras.
*
* @return Lista de compras
*/publicList<Purchase>getAll(){return purchaseRepository.getAll();}/**
* Metodo para buscar las compras de un cliente
*
* @paramclientId Identificador del cliente de tipo String
* @return las compras del cliente
*/publicOptional<List<Purchase>>getByClient(String clientId){return purchaseRepository.getByClient(clientId);}/**
* Metodo para guardar una compra
*
* @parampurchase Entity de Purchase
* @return */publicPurchasesave(Purchase purchase){return purchaseRepository.save(purchase);}}
@RestController
@RequestMapping(value = "/purchases")
public class PurchaseController {
Error:Could not read entity state fromResultSetEntityKey[]with root cause spring.
Causa: El celular de la entidad Cliente estaba como integer y lo cambie a long.
¿Como seria la peticion en postman para guardar una compra, estoy tratando pero me sale bad request 400?
Hola Jhon, ¿cómo está realizando la petición? Según el error, el problema está en que no se está construyendo apropiadamente la petición.
seleccionar el metodo POST y colocar el json en body
Alguien que me pueda explicar un poco más a profundidad la annotation @MapsId
Gracias!!
En otra nota el profesor le preguntan algo relacionado con @MapsId y el responde:
Cuando queremos guardar en cascada debemos poner la anotación @MapsId porque esta anotación es la que proporciona la asignación para una clave primaria cuando se usa @EmbeddedId.
La anotación @JoinColumn solo especifica que columna se relaciona a la hora trabajar con el atributo de la relación.
Otra forma de verlo podría ser: Se usa @MapsId para que al guardar en Cascada "cada objeto" de ComprasProducto,
se copie desde el objeto principal (Compra), el campo anotado con el @Id (idCompra), y se guarde este valor en el campo "idCompra" de ComprasProductoPK (clave embebida o compuesta de ComprasProducto).
Honestamente, no me están gustando esta serie de spring. No corre el código, y solo escribe, con frecuencia las explicaciones son superficiales y sigue avanzando sin consolidar los conocimientos con ejemplos prácticos.
Que vuelta tan enredada con esas relaciones y conversiones, RECOMENDACIÓN: Verificar que se tengan todos los getter an setter de las clases en las que aplique.
Comparto enlace donde explican diferentes usos de @mapsId: