🚀 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.LAZYna 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.