Pular para o conteúdo

Atividade 08: Persistência

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.


  1. Qual a principal diferença entre armazenar dados em uma List em 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.
  2. 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.
  3. 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.
  4. Entre Repository, CrudRepository e JpaRepository, qual possui a maior quantidade de métodos prontos?

    • a) Repository;
    • b) CrudRepository;
    • c) JpaRepository;
    • d) Todos possuem a mesma quantidade.

Marque V ou F e justifique as falsas.

  1. ( ) O H2 pode ser configurado para funcionar em memória ou em arquivo.
  2. ( ) A propriedade spring.jpa.hibernate.ddl-auto=update impede que o Hibernate crie ou altere tabelas automaticamente.
  3. ( ) É possível criar métodos de consulta personalizados apenas pelo nome do método (ex.: findByNome).
  4. ( ) O console do H2 é habilitado por padrão em qualquer projeto Spring Boot, sem configuração adicional.

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?

Pesquise e explique:

  1. A diferença entre findById (retorna Optional) e getReferenceById.
  2. O que significam as opções spring.jpa.hibernate.ddl-auto=update, create, create-drop e validate.
  3. Pelo menos 3 exemplos de queries derivadas do Spring Data (além de findByNome), explicando o que cada uma faz.

Nesta parte, você deve evoluir o projeto de produtos construído na Atividade 07 para persistir os dados usando Spring Data JPA e H2.

  • Adicione ao projeto as dependências Spring Data JPA e H2 Database.
  • Transforme a classe Produto em uma entidade JPA:
    • adicione a anotação @Entity;
    • adicione um construtor vazio (exigido pelo JPA), mantendo o construtor existente;
    • anote o campo id com @Id e @GeneratedValue(strategy = GenerationType.UUID).
  • 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.
  • Crie uma interface ProdutoRepository extends JpaRepository<Produto, UUID>.
  • Refatore o ProdutoController para usar o repositório diretamente, removendo a List em memória e implementando:
    • getAll() → retorna todos os produtos (findAll());
    • getOne(UUID id) → retorna um produto pelo id (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)).
  • Adicione ao ProdutoRepository o método List<Produto> findByNomeContaining(String nome) e utilize-o no endpoint GET /produtos/buscar.
  • Adicione mais um método derivado à sua escolha (ex.: findByPrecoLessThan, findByNomeOrderByPreco) e exponha-o em um novo endpoint.
  • 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 tabela produtos populada.
  • 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.