Pular para conteúdo

Aula 08 - Relacionamentos entre Entidades 🔗

Sistemas reais têm dados conectados: um Pedido pertence a um Cliente, um Cliente tem vários Pedidos. Nesta aula, vamos modelar esses relacionamentos com JPA.

😊 Os Tipos de Relacionamento

Anotação Relação Exemplo
@OneToMany / @ManyToOne Um para Muitos Um Cliente tem muitos Pedidos
@ManyToMany Muitos para Muitos Um Aluno está em muitos Cursos, e vice-versa
@OneToOne Um para Um Um Usuário tem um Perfil

📊 Modelando Cliente e Pedido

erDiagram
    CLIENTE ||--o{ PEDIDO : possui
    CLIENTE {
        long id
        string nome
    }
    PEDIDO {
        long id
        double valor
        long cliente_id
    }

🧠 Implementando @ManyToOne / @OneToMany

@Entity
public class Pedido {
    @Id @GeneratedValue
    private Long id;
    private double valor;

    @ManyToOne
    @JoinColumn(name = "cliente_id")
    private Cliente cliente;
}

@Entity
public class Cliente {
    @Id @GeneratedValue
    private Long id;
    private String nome;

    @OneToMany(mappedBy = "cliente")
    private List<Pedido> pedidos;
}

Important

O lado @ManyToOne é o "dono" do relacionamento — é ele quem tem a coluna de chave estrangeira (cliente_id) no banco de dados.

🧠 Cuidado com Loops Infinitos (JSON)

Caution

Se Cliente retorna Pedidos, e cada Pedido retorna Cliente de novo, você cria um loop infinito ao converter para JSON! Veremos como resolver isso com DTOs na Aula 10.

📝 Exercícios Progressivos

  1. Básico: Qual anotação usamos no lado "muitos" de um relacionamento Um-para-Muitos?
  2. Básico: Dê um exemplo do mundo real de um relacionamento Muitos-para-Muitos.
  3. Intermediário: Qual entidade fica com a coluna de chave estrangeira em um relacionamento @OneToMany/@ManyToOne?
  4. Intermediário: Por que relacionamentos bidirecionais podem causar problemas ao serializar para JSON?
  5. Desafio: Modele o relacionamento entre Curso e Aluno (muitos para muitos) usando @ManyToMany.

🚀 Mini-projeto: Crie a entidade Cliente e relacione-a com Pedido usando @OneToMany/@ManyToOne. Salve um cliente com 2 pedidos e verifique no banco de dados.