Service
MÉTODO SAVE() E @TRANSACTIONAL Veja aqui
O método receberá um BookRecordDto (parâmetro que será passado pelo cliente no Postman (um JSON))
Instanciaremos um BookModel;
E settaremos os valores;
O title nós conseguimos passar pelo Dto;
Mas os outros Sets, a gente precisa lembrar que temos os nossos relaciomentos das outras classes que precisamos passar para realizar o save.
Bom, então como settar os outros valores?
Book
Publisher Veja aqui
No postman o client passará uma publisherId e ela já tem que existir na base de dados.
No .setPublisher (do book), nós entraremos no publisherRepository e no findById, passaremos a .publisherId do cliente com a classe Dto.
Como esse método retorna um Optional, usaremos o .get() no final.
Authors Veja aqui
Assim como acima, o cliente passará uma Lista (contendo um ou mais) autores;
No .setAuthors, entraremos no repository e buscaremos pelo findAllById(passando uma listagem de UUID's). (esse método retorna uma lista).
Dentro desse find, passaremos o Dto, pegando a lista que o cliente passou no Postman.
Passaremos por fim, o .stream.collect para iterar a lista, obtendo essa listagem de Id's do tipo UUID's.
Review Veja aqui
Como estamos usando o modo CascadeType.All, o review também será salvo assim como a transação de salvamento do bookModel.
Instanciaremos um reviewModel;
Settaremos o comment extraindo diretamente do DTO;
Passaremos o livro para fazermos esse relacionamento um pra um.
E por fim, entraremos no book.setReview(passando aqui o reviewModel criado).
Com todos os parâmetros populados e preenchidos, será possivel dar o return com .save(passando aqui, o book).
@Transactional
Dentro do método save, teremos diversas execuções/transações na base de dados. Salvamentos, relacionamentos... Caso uma dessas transações falhe, o @Transactional garante um rollback.
Não será salvo uma review sem existir um Book, por exemplo. Havendo um erro em alguma das partes, teremos um rollback, preservando todos os dados.
Atualizado