Atividade 08: Persistência
Contexto
Seção intitulada “Contexto”Na Atividade 07 você construiu uma API de produtos com Spring Web, armazenando tudo em uma List<Produto> em memória.
O problema dessa abordagem é que, a cada reinicialização da aplicação, todos os dados são perdidos. Nesta atividade, vamos resolver isso persistindo os produtos em um banco de dados real usando Spring Data JPA e H2.
A atividade tem duas partes: Parte A com exercícios teóricos e Parte B com a evolução prática da API da Atividade 07.
Parte A - Exercícios teóricos
Seção intitulada “Parte A - Exercícios teóricos”Exercício A1 - Múltipla escolha
Seção intitulada “Exercício A1 - Múltipla escolha”-
Qual a principal diferença entre armazenar dados em uma
Listem memória e persistir em um banco de dados?- a) Não há diferença, ambos mantêm os dados após reiniciar a aplicação;
- b) Dados em memória são perdidos ao reiniciar a aplicação; dados persistidos continuam disponíveis;
- c) Dados em memória são mais lentos de acessar;
- d) Persistência é usada apenas para arquivos de texto.
-
O que faz a anotação
@Entity?- a) Define uma rota HTTP;
- b) Indica que a classe é gerenciada pelo Spring MVC;
- c) Mapeia a classe para uma tabela do banco de dados;
- d) Cria automaticamente um
Controller.
-
Qual a função de
@GeneratedValue?- a) Define o nome da tabela;
- b) Indica que o valor de um campo (geralmente o
@Id) é gerado automaticamente; - c) Valida os dados recebidos;
- d) Cria um índice no banco de dados.
-
Entre
Repository,CrudRepositoryeJpaRepository, qual possui a maior quantidade de métodos prontos?- a)
Repository; - b)
CrudRepository; - c)
JpaRepository; - d) Todos possuem a mesma quantidade.
- a)
Exercício A2 - Verdadeiro ou falso
Seção intitulada “Exercício A2 - Verdadeiro ou falso”Marque V ou F e justifique as falsas.
- ( ) O H2 pode ser configurado para funcionar em memória ou em arquivo.
- ( ) A propriedade
spring.jpa.hibernate.ddl-auto=updateimpede que o Hibernate crie ou altere tabelas automaticamente. - ( ) É possível criar métodos de consulta personalizados apenas pelo nome do método (ex.:
findByNome). - ( ) O console do H2 é habilitado por padrão em qualquer projeto Spring Boot, sem configuração adicional.
Exercício A3 - Discursiva
Seção intitulada “Exercício A3 - Discursiva”Explique, com suas palavras, o que é a camada de persistência e qual o papel do padrão Repository nela. Por que é interessante isolar o acesso a dados em vez de manipular o banco diretamente no Controller?
Exercício A4 - Pesquisa
Seção intitulada “Exercício A4 - Pesquisa”Pesquise e explique:
- A diferença entre
findById(retornaOptional) egetReferenceById. - O que significam as opções
spring.jpa.hibernate.ddl-auto=update,create,create-dropevalidate. - Pelo menos 3 exemplos de queries derivadas do Spring Data (além de
findByNome), explicando o que cada uma faz.
Parte B - Exercício de implementação
Seção intitulada “Parte B - Exercício de implementação”Nesta parte, você deve evoluir o projeto de produtos construído na Atividade 07 para persistir os dados usando Spring Data JPA e H2.
Exercício B1 - Configurando a persistência
Seção intitulada “Exercício B1 - Configurando a persistência”Requisitos
Seção intitulada “Requisitos”- Adicione ao projeto as dependências
Spring Data JPAeH2 Database. - Transforme a classe
Produtoem uma entidade JPA:- adicione a anotação
@Entity; - adicione um construtor vazio (exigido pelo JPA), mantendo o construtor existente;
- anote o campo
idcom@Ide@GeneratedValue(strategy = GenerationType.UUID).
- adicione a anotação
- Configure o H2 no
application.properties(ou.yml), definindo:- a URL do banco (
spring.datasource.url); spring.jpa.generate-ddl=true;spring.jpa.hibernate.ddl-auto=update;spring.h2.console.enabled=true;spring.jpa.show-sql=true.
- a URL do banco (
Exercício B2 - Repositório
Seção intitulada “Exercício B2 - Repositório”Requisitos
Seção intitulada “Requisitos”- Crie uma interface
ProdutoRepository extends JpaRepository<Produto, UUID>. - Refatore o
ProdutoControllerpara usar o repositório diretamente, removendo aListem memória e implementando:getAll()→ retorna todos os produtos (findAll());getOne(UUID id)→ retorna um produto peloid(findById(id).get());save(Produto produto)→ salva um novo produto (save(...));update(UUID id, Produto produtoAtualizado)→ atualiza um produto existente;delete(UUID id)→ remove um produto (deleteById(id)).
Exercício B3 - Queries derivadas
Seção intitulada “Exercício B3 - Queries derivadas”Requisitos
Seção intitulada “Requisitos”- Adicione ao
ProdutoRepositoryo métodoList<Produto> findByNomeContaining(String nome)e utilize-o no endpointGET /produtos/buscar. - Adicione mais um método derivado à sua escolha (ex.:
findByPrecoLessThan,findByNomeOrderByPreco) e exponha-o em um novo endpoint.
Exercício B4 - Validando a persistência
Seção intitulada “Exercício B4 - Validando a persistência”Requisitos
Seção intitulada “Requisitos”- Inicie a aplicação, cadastre pelo menos 3 produtos pelo
POST /produtos. - Reinicie a aplicação e confirme, pelo
GET /produtos, que os dados continuam disponíveis. - Acesse o console do H2 (
/h2-console) e mostre, com um print, a tabelaprodutospopulada.
Entrega esperada
Seção intitulada “Entrega esperada”- Parte A: respostas dos exercícios teóricos.
- Parte B: código-fonte do projeto evoluído e prints do H2 Console e de requisições no Postman/Insomnia comprovando a persistência dos dados.