🚀 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
- Segurança de Tipos: Diferente do SQL puro, aqui o compilador valida todas as relações.
- Flexibilidade: Podemos injetar lógica complexa, como criptografia de senhas ou cálculos dinâmicos, durante a carga.
- 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 osPedidosassociados, graças à anotaçãocascade = CascadeType.ALLdefinida em nossa classeCliente.
Com os dados carregados, estamos prontos para construir a interface visual do sistema da Green Dog!