🚀 4.5 Carga Inicial: Do SQL ao CommandLineRunner

Em sistemas de produção, a carga inicial costuma ser feita via scripts SQL. No entanto, durante o desenvolvimento de uma Prova de Conceito, muitas vezes é mais produtivo e seguro realizar essa carga programaticamente via Java, garantindo a validação das regras de negócio.

Implementação com CommandLineRunner

Utilizaremos a interface CommandLineRunner, que o Spring Boot executa automaticamente logo após a inicialização do contexto da aplicação.

O Componente de Carga Premium

Utilizaremos o padrão Builder (fornecido pelo Lombok) para criar nossos objetos e a Injeção via Construtor para os repositórios.

package com.example.demo.loader;
 
import com.example.demo.domain.*;
import com.example.demo.repository.*;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Configuration;
import java.time.OffsetDateTime;
import java.util.Arrays;
 
@Configuration
@RequiredArgsConstructor
public class DataLoader implements CommandLineRunner {
 
    private final ClienteRepository clienteRepository;
    private final ItemRepository itemRepository;
 
    @Override
    public void run(String... args) throws Exception {
        System.out.println("🚀 [Green Dog] Iniciando Carga de Dados de Elite...");
 
        // 1. Criando Itens (Cardápio)
        Item dog1 = Item.builder().nome("Green Dog Tradicional").preco(25.0).build();
        Item dog2 = Item.builder().nome("Green Dog Picante").preco(27.0).build();
        itemRepository.saveAll(Arrays.asList(dog1, dog2));
 
        // 2. Criando Clientes e Pedidos Relacionados
        Cliente fernando = Cliente.builder()
                .nome("Fernando Boaglio")
                .endereco("Sampa")
                .build();
 
        Pedido p1 = Pedido.builder()
                .cliente(fernando)
                .itens(Arrays.asList(dog1))
                .data(OffsetDateTime.now())
                .valorTotal(25.0)
                .build();
 
        fernando.setPedidos(Arrays.asList(p1));
 
        // 3. Persistência em Cascata
        clienteRepository.save(fernando);
 
        System.out.println("✅ [Green Dog] Carga finalizada com sucesso!");
    }
}

Benefícios desta Abordagem

  1. Segurança de Tipos: Diferente do SQL puro, aqui o compilador valida todas as relações.
  2. Flexibilidade: Podemos injetar lógica complexa, como criptografia de senhas ou cálculos dinâmicos, durante a carga.
  3. Logs de Elite: Podemos fornecer feedback visual no console sobre o progresso da carga.

CAUTION

Cascateamento: Note que ao salvar o Cliente, o Spring Data JPA salva automaticamente os Pedidos associados, graças à anotação cascade = CascadeType.ALL definida em nossa classe Cliente.

Com os dados carregados, estamos prontos para construir a interface visual do sistema da Green Dog!


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