CodeGym /Cursos /Módulo 5. Spring /Práctica: creación de entidades y repositorios

Práctica: creación de entidades y repositorios

Módulo 5. Spring
Nivel 5 , Lección 4
Disponible

Hoy vamos a implementar una parte pequeña pero importante de nuestra aplicación: crearemos entidades y repositorios. Ampliamos la funcionalidad del proyecto añadiendo trabajo con la base de datos. Durante el proceso iremos paso a paso revisando:

  1. Creación de la entidad — la base del trabajo con JPA. Usaremos anotaciones como @Entity, @Id, @GeneratedValue y otras.
  2. Configuración de los repositorios. Conectaremos JpaRepository y usaremos sus métodos estándar.
  3. Trabajo práctico con operaciones CRUD. Guardaremos, actualizaremos, eliminaremos y leeremos datos desde la base.

1. Planteamiento de la tarea

Imagínate que trabajas en un sistema de gestión del catálogo de una biblioteca. En este ejemplo didáctico crearemos la entidad Book, que representará un libro, y proporcionaremos operaciones básicas para interactuar con ella a través de la base de datos. Nuestras tareas:

  • Crear la entidad Book con los campos id, title, author y publishedYear.
  • Implementar un repositorio para ella.
  • Escribir métodos para guardar y obtener datos.

2. Creación de la entidad

Empezamos creando la clase-entidad Book. Recordemos la regla principal: las entidades mapean tablas en la base de datos. Cada campo de la clase se convierte en una columna de la tabla. Para ello usaremos las anotaciones @Entity, @Id, @GeneratedValue, @Column.

Abre el proyecto y añade la nueva clase Book en el paquete entity.


package com.example.library.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Column;

@Entity
public class Book {

    @Id // Indicamos la clave primaria
    @GeneratedValue(strategy = GenerationType.IDENTITY) // Generación automática del ID
    private Long id;

    @Column(nullable = false) // Campo obligatorio
    private String title;

    @Column(nullable = false)
    private String author;

    @Column(name = "published_year") // Indicamos el nombre de la columna en la base
    private Integer publishedYear;

    // Constructores, getters, setters
    public Book() {
    }

    public Book(String title, String author, Integer publishedYear) {
        this.title = title;
        this.author = author;
        this.publishedYear = publishedYear;
    }

    // Getters y setters
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public Integer getPublishedYear() {
        return publishedYear;
    }

    public void setPublishedYear(Integer publishedYear) {
        this.publishedYear = publishedYear;
    }
}

En el código:

  • @Entity — indica que la clase es una entidad y se mapeará a una tabla en la base.
  • @Id — campo que será usado como clave primaria de la tabla.
  • @GeneratedValue(strategy = GenerationType.IDENTITY) — generación automática del ID para los nuevos registros.
  • @Column — configuración de las columnas de la tabla; añadimos nullable = false para hacer el campo obligatorio.

Ahora que nuestra entidad está lista, ¡vamos al siguiente paso!


3. Creación del repositorio

El repositorio se encarga de las operaciones con la base de datos. En Spring Data JPA se usan interfaces, como JpaRepository. Crearemos la interfaz BookRepository y usaremos los métodos estándar.

Añade un nuevo interfaz en el paquete repository.


package com.example.library.repository;

import com.example.library.entity.Book;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface BookRepository extends JpaRepository<Book, Long> {
    // Aquí se pueden añadir métodos personalizados si hacen falta
}
  • JpaRepository<Book, Long> — el tipo Book indica nuestra entidad, y Long el tipo de su identificador.
  • La anotación @Repository le dice a Spring que este componente trabaja con la base de datos.

Métodos incorporados de JpaRepository

Al heredar de JpaRepository, ya podemos usar métodos como:

  • save() — para guardar el objeto.
  • findById() — para buscar un objeto por ID.
  • findAll() — para obtener la lista de todos los objetos.
  • deleteById() — para eliminar el objeto por ID.

4. Trabajo práctico: operaciones CRUD

Ahora vamos a probar el funcionamiento de las entidades y repositorios creados. Para ello crearemos un servicio básico y añadiremos datos de prueba.

Añade un nuevo servicio en el paquete service.


package com.example.library.service;

import com.example.library.entity.Book;
import com.example.library.repository.BookRepository;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
public class BookService {

    private final BookRepository bookRepository;

    public BookService(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }

    // Añadir libro
    public Book addBook(Book book) {
        return bookRepository.save(book);
    }

    // Obtener todos los libros
    public List<Book> getAllBooks() {
        return bookRepository.findAll();
    }

    // Buscar libro por ID
    public Optional<Book> getBookById(Long id) {
        return bookRepository.findById(id);
    }

    // Eliminar libro por ID
    public void deleteBook(Long id) {
        bookRepository.deleteById(id);
    }
}

Ahora añadimos un controlador para probar la funcionalidad mediante peticiones HTTP.


package com.example.library.controller;

import com.example.library.entity.Book;
import com.example.library.service.BookService;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/books")
public class BookController {

    private final BookService bookService;

    public BookController(BookService bookService) {
        this.bookService = bookService;
    }

    @PostMapping
    public Book addBook(@RequestBody Book book) {
        return bookService.addBook(book);
    }

    @GetMapping
    public List<Book> getAllBooks() {
        return bookService.getAllBooks();
    }

    @GetMapping("/{id}")
    public Book getBookById(@PathVariable Long id) {
        return bookService.getBookById(id).orElseThrow(() -> new RuntimeException("Book not found"));
    }

    @DeleteMapping("/{id}")
    public void deleteBook(@PathVariable Long id) {
        bookService.deleteBook(id);
    }
}

Para comprobarlo puedes enviar peticiones con Postman u otra herramienta similar.


5. Ejecución y verificación

  1. Arranca la aplicación en tu servidor local.
  2. Revisa la base de datos para asegurarte de que la tabla book se ha creado.
  3. Usa estas peticiones:
    • POST /books con el cuerpo:
      
      {
        "title": "Spring in Action",
        "author": "Craig Walls",
        "publishedYear": 2021
      }
      
    • GET /books — para obtener todos los libros.
    • GET /books/{id} — para obtener un libro por ID.
    • DELETE /books/{id} — para eliminar un libro.

¡Felicidades! Has creado tu primera entidad y la has conectado a la base con el mínimo esfuerzo. Ahora tu código está más cerca del entorno de producción real.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION