Spec Backend Com Java E Springboot • Trilha Progressiva em 4 Níveis


🎯 Nível 1: Fundamentos

Problema 06.1 — Relacionamento @ManyToOne com FetchType.LAZY

Contexto: Relacionamento @ManyToOne com FetchType.LAZY no contexto de Relacionamentos JPA e FetchType.

Requisitos de Execução:

  1. Mapear relação entre ItemPedido e Pedido com @ManyToOne(fetch = FetchType.LAZY) e @JoinColumn.

Resultado Esperado

Chave estrangeira mapeada com carregamento tardio configurado.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_06_1_SeuNome
  2. Envie na tarefa: Atividade Cap 06 - Relacionamentos JPA e FetchType
🔑 Gabarito de Código & Solução Comentada
// ItemPedido.java
package com.empresa.api.model;

import jakarta.persistence.*;

@Entity
public class ItemPedido {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "pedido_id", nullable = false)
    private Pedido pedido;

    private Integer quantidade;
}

🔍 Nível 2: Prática

Problema 06.2 — Relacionamento Bidirecional @OneToMany com cascade = CascadeType.ALL

Contexto: Relacionamento Bidirecional @OneToMany com cascade = CascadeType.ALL no contexto de Relacionamentos JPA e FetchType.

Requisitos de Execução:

  1. Mapear lista de itens no Pedido com orphanRemoval = true e método auxiliar de sincronização bidirecional.

Resultado Esperado

Persistência em cascata de pedido e seus respectivos itens.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_06_2_SeuNome
  2. Envie na tarefa: Atividade Cap 06 - Relacionamentos JPA e FetchType
🔑 Gabarito de Código & Solução Comentada
// Pedido.java
package com.empresa.api.model;

import jakarta.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
public class Pedido {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "pedido", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<ItemPedido> itens = new ArrayList<>();
}

⚡ Nível 3: Integração

Problema 06.3 — Relacionamento @ManyToMany com Tabela de Junção @JoinTable

Contexto: Relacionamento @ManyToMany com Tabela de Junção @JoinTable no contexto de Relacionamentos JPA e FetchType.

Requisitos de Execução:

  1. Mapear relacionamento muitos-para-muitos entre Usuario e Perfil definindo nome da tabela de junção.

Resultado Esperado

Tabela de ligação 'usuarios_perfis' configurada com chaves estrangeiras compostas.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_06_3_SeuNome
  2. Envie na tarefa: Atividade Cap 06 - Relacionamentos JPA e FetchType
🔑 Gabarito de Código & Solução Comentada
// ManyToManyMapping.java
package com.empresa.api.model;

import jakarta.persistence.*;
import java.util.Set;

@Entity
public class Perfil {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nome;

    @ManyToMany(mappedBy = "perfis")
    private Set<UsuarioRel> usuarios;
}

🏆 Nível 4: Desafio Corporativo

Problema 06.4 — Otimização de Consultas com @EntityGraph para Evitar Problema N+1

Contexto: Otimização de Consultas com @EntityGraph para Evitar Problema N+1 no contexto de Relacionamentos JPA e FetchType.

Requisitos de Execução:

  1. Declarar @EntityGraph(attributePaths = {'itens', 'cliente'}) eliminando queries N+1 no Hibernate.

Resultado Esperado

Consulta executada com JOIN único carregando entidades relacionadas.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_06_4_SeuNome
  2. Envie na tarefa: Atividade Cap 06 - Relacionamentos JPA e FetchType
🔑 Gabarito de Código & Solução Comentada
// EntityGraphDemo.java
package com.empresa.api.repository;

import org.springframework.data.jpa.repository.EntityGraph;
import org.springframework.data.jpa.repository.JpaRepository;
import com.empresa.api.model.Pedido;
import java.util.List;

public interface PedidoGraphRepository extends JpaRepository<Pedido, Long> {
    @EntityGraph(attributePaths = {"itens"})
    List<Pedido> findAll();
}