Paso 3: CRUD Editorial - Book - Explicación del código
Anotaciones en las clases Entity
Las anotaciones en las clases Entity para indicar la relación entre Editorial y Book y entre Book y Editorial son las siguientes:
BookEntity
La clase BookEntity
define un atributo para la relación con editorial. Este atributo tiene la anotación @ManyToOne para indicar que hay muchos libros relacionados con la misma editorial pero un libro solo tiene una editorial.
EditorialEntity
La clase EditorialEntity
define un atributo para la relación con la colección de libros. Este atributo tiene la anotación @OneToMany para indicar que hay muchos libros relacionados con la misma editorial pero un libro solo tiene una editorial.
Es importante notar el atributo mappedBy = "editorial"
. Este valor contiene el nombre del atributo en la clase destino correspondiente con esta relación (podría haber varias relaciones distintas desde book a editorial). El que este atributo este definido en EditorialEntity significa que BookEntity
es el lado propietario de la relación (the owning side), es decir, en la base de datos, en la tabla de BOOK cada fila guardará la llave foráneas de la editorial a la que pertenece. La figura muestra la estructura física de las tablas, donde vemos que e la tabla de BOOKENTITY
tiene el EDITORIAL_ID
como llave foránea:
Definición del subrecurso EditorialBooksResource
La clase EditorialResource
está anotada con el path editorials
. Lo que significa que todos los servicios HTTP que tengan una url que comienza por:
urlsevidor/api/editorials
se buscarán en este archivo.
La clase tiene definido el siguiente método:
todos los servicios HTTP que tengan una url que comienza por:
urlsevidor/api/editorials/{editorialsId: \\d+}/books
entrarán a este método que hacer dos cosas:
- Validar que la editorial con identificador editorialsId exista. Si no existe, dispara la excepción.
- Redirecciona el llamado al subrecurso definido en la clase
EditorialBooksResource
.
La clase EditorialBooksResource
no tiene un path al inicio de la clase pero todos los métodos anotados con GET/POST/PUT/DELETE deben declarar un parámetro:
@PathParam("editorialsId")Long editorialsId
que corresponde con el path del método donde se redireccionó al subrecurso.