🧩 Exercícios: Relacionamentos JPA e FetchType
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:
- Mapear relação entre
ItemPedidoePedidocom@ManyToOne(fetch = FetchType.LAZY)e@JoinColumn.
Resultado Esperado
Chave estrangeira mapeada com carregamento tardio configurado.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_06_1_SeuNome - 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:
- Mapear lista de itens no
PedidocomorphanRemoval = truee 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)
- Salve o arquivo como:
Atividade_06_2_SeuNome - 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:
- Mapear relacionamento muitos-para-muitos entre
UsuarioePerfildefinindo 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)
- Salve o arquivo como:
Atividade_06_3_SeuNome - 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:
- 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)
- Salve o arquivo como:
Atividade_06_4_SeuNome - 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();
}