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.

@Entity public class BookEntity extends BaseEntity implements Serializable { private String isbn; private String image; @Temporal(TemporalType.DATE) private Date publishDate; private String description; @ManyToOne private EditorialEntity 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.

@Entity public class EditorialEntity extends BaseEntity implements Serializable { @OneToMany(mappedBy = "editorial") private List<BookEntity> books = new ArrayList<BookEntity>(); public List<BookEntity> getBooks() { return books; } public void setBooks(List<BookEntity> books) { this.books = books; } }

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.

... @Path("editorials") public class EditorialResource { ... }

La clase tiene definido el siguiente método:

... @Path("editorials") public class EditorialResource { ... @Path("{editorialsId: \\d+}/books") public Class<EditorialBooksResource> getEditorialBooksResource(@PathParam("editorialsId") Long editorialsId) { EditorialEntity entity = editorialLogic.getEditorial(editorialsId); if (entity == null) { throw new WebApplicationException("El recurso /editorials/" + editorialsId + " no existe.", 404); } return EditorialBooksResource.class; } ... }

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:

  1. Validar que la editorial con identificador editorialsId exista. Si no existe, dispara la excepción.
  2. 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.

results matching ""

    No results matching ""