Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

NullPointerException ao consultar produto

Ola, estou recebendo uma NullPointerException ao tentar consultar o produto pelo ID, olhei todo o código e n sei onde está o erro.


public class CadastroDeProduto {

    public static void main(String[] args) {
        cadastrarProduto();
        EntityManager em = JPAUtil.getEntityManager();
        ProdutoDao produtoDao = new ProdutoDao(em);

        Produto p = produtoDao.buscarPorId(1l);
        System.out.println(p.getPreco());

        List<Produto> produto = produtoDao.buscarTodos();
        produto.forEach(p2 -> System.out.println(p.getNome()));
    }

    private static void cadastrarProduto() {
        Categoria celulares = new Categoria("CELULARES");

        EntityManager em = JPAUtil.getEntityManager();

        em.getTransaction().begin();
        em.persist(celulares);
        celulares.setNome("xpto");

        em.flush();
        em.clear();

        celulares = em.merge(celulares);
        celulares.setNome("1234");
        em.flush();
        em.clear();

    }

}
package br.com.alura.loja.modelo;

import java.math.BigDecimal;
import java.time.LocalDate;

import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "produtos")
public class Produto {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nome;
    private String descricao;
    private BigDecimal preco;
    private LocalDate dataCadastro = LocalDate.now();
    @ManyToOne
    private Categoria categoria;

    public Produto() {
        // TODO Auto-generated constructor stub
    }

    public Produto(String nome, String descricao, BigDecimal preco, Categoria categoria) {
        this.nome = nome;
        this.descricao = descricao;
        this.preco = preco;
        this.categoria = categoria;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public BigDecimal getPreco() {
        return preco;
    }

    public void setPreco(BigDecimal preco) {
        this.preco = preco;
    }

}
public class ProdutoDao {

    private EntityManager em;

    public ProdutoDao(EntityManager em) {
        this.em = em;
    }

    public void cadastrar(Produto produto) {
        this.em.persist(produto);
    }

    public void atualizar(Categoria categoria) {
        this.em.merge(categoria);
    }

    public void remover(Categoria categoria) {
        categoria = em.merge(categoria);
        this.em.remove(categoria);
    }

    public Produto buscarPorId(Long id) {
        return em.find(Produto.class, id);
    }

    public List<Produto> buscarTodos(){
        String jpql = "SELECT p FROM Produto p";
        return em.createQuery(jpql, Produto.class).getResultList();
    }

}

Hibernate: create table categorias (id bigint generated by default as identity, nome varchar(255), primary key (id))
Hibernate: create table produtos (id bigint generated by default as identity, dataCadastro date, descricao varchar(255), nome varchar(255), preco decimal(19,2), categoria_id bigint, primary key (id))
Hibernate: alter table produtos add constraint FK8rqw0ljwdaom34jr2t46bjtrn foreign key (categoria_id) references categorias
dez. 19, 2021 3:36:56 PM org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator initiateService
INFO: HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
Hibernate: insert into categorias (id, nome) values (null, ?)
Hibernate: update categorias set nome=? where id=?
Hibernate: select categoria0_.id as id1_0_0_, categoria0_.nome as nome2_0_0_ from categorias categoria0_ where categoria0_.id=?
Hibernate: update categorias set nome=? where id=?
Hibernate: select produto0_.id as id1_1_0_, produto0_.categoria_id as categori6_1_0_, produto0_.dataCadastro as datacada2_1_0_, produto0_.descricao as descrica3_1_0_, produto0_.nome as nome4_1_0_, produto0_.preco as preco5_1_0_, categoria1_.id as id1_0_1_, categoria1_.nome as nome2_0_1_ from produtos produto0_ left outer join categorias categoria1_ on produto0_.categoria_id=categoria1_.id where produto0_.id=?
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "br.com.alura.loja.modelo.Produto.getPreco()" because "p" is null
    at br.com.alura.loja.teste.CadastroDeProduto.main(CadastroDeProduto.java:24)
1 resposta
solução!

Oi Victor,

O problema ocorre na classe CadasroDeProduto nessa linha que tem o System.out.println do método main:

Produto p = produtoDao.buscarPorId(1l);
System.out.println(p.getPreco());

O objeto p está null, ou seja, não está sendo retornado do banco de dados um Produto com id = 1

Isso está ocorrendo porque no seu método cadastrarProduto não está sendo salvo um produto no banco de dados, mas apenas a categoria de nome CELULARES.