Resumen

¿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

  1. Creación de la clase CompraRepository:
    • Dentro del paquete persistence, crea una nueva clase Java llamada CompraRepository.
    • Esta clase debe implementar PurchaseRepository.
  2. 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.

public interface CompraCrudRepository extends CrudRepository<Compra, Integer> {
    // Métodos adicionales según el caso
}

Luego, debes inyectar esta interfaz en tu CompraRepository junto al mapper necesario:

@Autowired
private CompraCrudRepository compraCrudRepository;

@Autowired
private PurchaseMapper purchaseMapper;

Implementación de métodos fundamentales

Método getAll

El método getAll recupera todos los registros de compras y los convierte a objetos del dominio:

public List<Purchase> getAll() {
    List<Compra> compras = (List<Compra>) compraCrudRepository.findAll();
    return purchaseMapper.toPurchases(compras);
}

Método getByClient

Para recuperar compras por cliente, es necesario crear un query método dentro del CompraCrudRepository:

Optional<List<Compra>> findByClienteId(String clientId);

Y emplearlo dentro de CompraRepository:

public Optional<List<Purchase>> getByClient(String clientId) {
    return compraCrudRepository.findByClienteId(clientId)
            .map(compras -> purchaseMapper.toPurchases(compras));
}

Guardado en cascada

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.

@OneToMany(mappedBy = "compra", cascade = CascadeType.ALL)
private List<Producto> productos;

Configura la relación en la entidad CompraProducto para que los productos puedan asociarse correctamente a una compra.

Método save

public Purchase save(Purchase purchase) {
    Compra compra = purchaseMapper.toCompra(purchase);
    compra.getProductos().forEach(producto -> producto.setCompra(compra));
    return purchaseMapper.toPurchase(compraCrudRepository.save(compra));
}

¿Qué sigue después de implementar el repositorio?

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!