Paso 4: CRUD Book - Review - 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:
ReviewEntity
La clase ReviewEntity
define un atributo para la relación con el libro al que pertenece. Este atributo tiene la anotación @ManyToOne para indicar que hay muchos reviews relacionados con el mismo libro pero un review pertenece a un único libro.
BookEntity
La clase BookEntity
define un atributo para la relación con la colección de reviews. Este atributo tiene la anotación @OneToMany para indicar que hay muchos reviews relacionados con el mismo libro.
Note que la anotación @OneToMany
tiene varios atributos:
mappedBy = "book"
para indicar que esta relación que estamos definiendo se refiere a la misma que en la claseReviewEntity
está definida con el atributo "book". Con respecto a las tablas significa que es la tabla de reviews quien tiene la llave foránea al libro que corresponde.cascade = CascadeType.ALL
significa que cualquier operación sobre un libro debe propagarse sobre cada una de sus reviews. En particular si un libro se borra se deben borrar todos sus reviews.orphanRemoval = true
significa que no puede haber un reviews si no está asociado con un libro. No puede estar "huérfano".
Definición del subrecurso ReviewResource
La clase BookResource
está anotada con el path books
. Lo que significa que todos los servicios HTTP que tengan una url que comienza por:
urlsevidor/api/books
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/books/{booksId: \\d+}/reviews
entrarán a este método que hacer dos cosas:
- Validar que el libro con identificador
booksid
exista. Si no existe, dispara la excepción. - Redirecciona el llamado al subrecurso definido en la clase
ReviewResource
.
La clase ReviewResource
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("booksId")Long booksId
que corresponde con el path del método donde se redireccionó al subrecurso.