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 claseReviewEntityestá 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.ALLsignifica 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 = truesignifica 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
booksidexista. 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.