1
resposta

[Projeto] Desafio: hora da prática

package br.com.gerenciador.pedidos.model;

import jakarta.persistence.*;

@Entity
public class Produto {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    @Column(unique = true, nullable = false)
    private String nome;
    @Column(name = "valor")
    private double preco;

    public Produto() {
    }

    public Produto(String nome, double preco) {
        this.nome = nome;
        this.preco = preco;
    }

    public long getId() {
        return id;
    }

    public String getNome() {
        return nome;
    }


    public double getPreco() {
        return preco;
    }

}
package br.com.gerenciador.pedidos.model;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;

@Entity
public class Categoria {
    @Id
    private long id;
    private String nome;

    public Categoria() {}

    public Categoria(long id, String nome) {
        this.id = id;
        this.nome = nome;
    }

    public long getId() {
        return id;
    }


    public String getNome() {
        return nome;
    }

}
package br.com.gerenciador.pedidos.model;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;

import java.time.LocalDate;

@Entity
public class Pedido {
    @Id
    private long id;
    private LocalDate data;

    public Pedido() {}

    public Pedido(long id, LocalDate data) {
        this.id = id;
        this.data = data;
    }

    public long getId() {
        return id;
    }


    public LocalDate getData() {
        return data;
    }
}
package br.com.gerenciador.pedidos.repositorio;

import br.com.gerenciador.pedidos.model.Pedido;
import br.com.gerenciador.pedidos.model.Produto;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ProdutoRepositorio extends JpaRepository<Produto, Long> {}
package br.com.gerenciador.pedidos.repositorio;

import br.com.gerenciador.pedidos.model.Categoria;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface CategoriaRepositorio extends JpaRepository<Categoria, Long> {}
package br.com.gerenciador.pedidos.repositorio;

import br.com.gerenciador.pedidos.model.Pedido;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface PedidoRepositorio extends JpaRepository<Pedido, Long> {}
package br.com.gerenciador.pedidos.main;

import br.com.gerenciador.pedidos.model.Categoria;
import br.com.gerenciador.pedidos.model.Pedido;
import br.com.gerenciador.pedidos.model.Produto;
import br.com.gerenciador.pedidos.repositorio.CategoriaRepositorio;
import br.com.gerenciador.pedidos.repositorio.PedidoRepositorio;
import br.com.gerenciador.pedidos.repositorio.ProdutoRepositorio;
import org.springframework.stereotype.Component;

import java.time.LocalDate;

@Component
public class Principal {
    private PedidoRepositorio pedidoRepositorio;
    private CategoriaRepositorio categoriaRepositorio;
    private ProdutoRepositorio produtoRepositorio;

    public Principal(PedidoRepositorio pedidoRepositorio, CategoriaRepositorio categoriaRepositorio, ProdutoRepositorio produtoRepositorio) {
        this.pedidoRepositorio = pedidoRepositorio;
        this.categoriaRepositorio = categoriaRepositorio;
        this.produtoRepositorio = produtoRepositorio;
    }

    Produto produto = new Produto("Notebook", 3500.0);
    Categoria categoria = new Categoria(1L, "Eletrônicos");
    Pedido pedido = new Pedido(1L, LocalDate.now());

    public void salvar() {
        produtoRepositorio.save(produto);
        categoriaRepositorio.save(categoria);
        pedidoRepositorio.save(pedido);
    }
}
package br.com.gerenciador.pedidos;

import br.com.gerenciador.pedidos.main.Principal;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class PedidosApplication implements CommandLineRunner {
    @Autowired
    private Principal principal;

    public static void main(String[] args) {
        SpringApplication.run(PedidosApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        principal.salvar();
    }
}
1 resposta

Oii, Aline!

Meus parabéns pela excelente resolução do desafio.

Seu projeto demonstra um domínio muito bom da integração entre o Spring Boot e a JPA. Você aplicou corretamente as anotações fundamentais de mapeamento objeto-relacional, como @Entity, @Id e @GeneratedValue.

Um ponto muito positivo foi você ter se lembrado do construtor padrão (public Produto() {}). Como a JPA utiliza reflexão para instanciar as classes ao buscar dados no banco, a ausência dele é uma das causas mais comuns de erro para quem está começando. Outro destaque vai para o uso do @Component e da injeção de dependência via construtor na classe Principal, que é a forma mais recomendada e profissional de lidar com componentes no Spring.

Para saber mais sobre como personalizar as colunas, recomendo a leitura sobre as propriedades da anotação @Column.

Você sentiu muita diferença na facilidade de salvar os dados usando o JpaRepository em comparação com o uso de JDBC puro?

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!