🚀 4.2 Arquitetura de Domínio de Alta Fidelidade

No coração do sistema Green Dog Delivery, as Classes de Domínio definem a estrutura e as regras de integridade dos dados. Na Engenharia Premium, utilizamos o Jakarta Persistence 3.1 e o Lombok para garantir que o código seja expressivo, seguro e livre de ruídos (boilerplate).

Entidades de Elite

1. Cliente: O Centro do Negócio

Representa quem consome nossos serviços. Utilizamos Injeção de Dependência via Lombok para garantir a fluidez no desenvolvimento.

package com.example.demo.domain;
 
import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.*;
import java.util.List;
 
@Entity
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Cliente {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
 
    @NotNull
    @Size(min = 2, max = 50, message = "O nome deve ter entre {min} e {max} caracteres")
    private String nome;
 
    @NotNull
    @Size(min = 2, max = 255, message = "O endereço deve ser detalhado")
    private String endereco;
 
    @OneToMany(mappedBy = "cliente", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<Pedido> pedidos;
}

2. Pedido: A Operação

Gerencia a relação entre clientes e itens. Nota-se o uso de OffsetDateTime para precisão temporal em conformidade com o Java 17.

package com.example.demo.domain;
 
import jakarta.persistence.*;
import jakarta.validation.constraints.Min;
import lombok.*;
import java.time.OffsetDateTime;
import java.util.List;
 
@Entity
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Pedido {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
 
    @ManyToOne
    @JoinColumn(name = "cliente_id")
    private Cliente cliente;
 
    @ManyToMany
    @JoinTable(name = "pedido_itens",
               joinColumns = @JoinColumn(name = "pedido_id"),
               inverseJoinColumns = @JoinColumn(name = "item_id"))
    private List<Item> itens;
 
    private OffsetDateTime data;
 
    @Min(value = 1, message = "O valor total deve ser positivo")
    private Double valorTotal;
}

3. Item: O Produto

Define os componentes do nosso cardápio de hot-dogs.

package com.example.demo.domain;
 
import jakarta.persistence.*;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.*;
 
@Entity
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Item {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
 
    @NotNull
    @Size(min = 2, max = 50)
    private String nome;
 
    @NotNull
    @Min(value = 1, message = "O preço deve ser superior a R$ 1,00")
    private Double preco;
}

IMPORTANT

Performance Tip: O uso de FetchType.LAZY na lista de pedidos do Cliente é uma prática de elite para evitar o carregamento desnecessário de dados na memória. Só carregamos o que é estritamente necessário para a operação.

No próximo capítulo, exploraremos como o Lombok atua nos bastidores para manter essas classes tão limpas.


⬅️ Capítulo Anterior | Próximo Capítulo ➡️