Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

NullPointerException na seleção dos dados

Na hora de selecionar os produtos para listar no banco de dados, está vindo tudo nulo e dando NullPointerException apontando para o select.

public List<Produto> listar() {
    return manager.createQuery("select p from Produto p", Produto.class)
            .getResultList();
}
4 respostas

Boa noite Victor, verifica se o manager não está nulo

A parte de inserir dados no banco está normal, creio que esse não seja o problema.

Boa tarde, acabei de perceber que o erro está no manager sim, porém não entendo o porque ele insere os dados e não busca.

Classe de Configuração do JPA

package br.com.cdc.loja.dao;

import java.util.Properties;

import javax.persistence.EntityManagerFactory;

import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableTransactionManagement
public class JPAConfig {

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();

        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();

        factoryBean.setJpaVendorAdapter(vendorAdapter);

        DriverManagerDataSource ds = new DriverManagerDataSource();

        ds.setUsername("root");
        ds.setPassword("");
        ds.setUrl("jdbc:mysql://localhost:3306/casadocodigo");
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        factoryBean.setDataSource(ds);

        Properties prop = new Properties();

        prop.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
        prop.setProperty("hibernate.show_sql", "true");

        prop.setProperty("hibernate.hbm2dll.auto", "update");
        factoryBean.setJpaProperties(prop);

        factoryBean.setPackagesToScan("br.com.cdc.loja.models");

        return factoryBean;
    }

    @Bean
    public JpaTransactionManager jpaTransactionManager(EntityManagerFactory emf) {

        return new JpaTransactionManager(emf);
    }

}

Classe do ProdutoDAO

package br.com.cdc.loja.dao;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import br.com.cdc.loja.models.Produto;

@Repository
@Transactional
public class ProdutoDAO {

    @PersistenceContext
    private EntityManager em;

    public void gravar(Produto p) {
        em.persist(p);
    }

    public List<Produto> listar() {

        try {
            Produto find = em.find(Produto.class, 1);
            List<Produto> lista = new ArrayList<>();
            lista.add(find);
            em.getTransaction().commit();
            return lista;

        } catch (NullPointerException e) {
            System.out.println(e.getMessage());
            return new ArrayList<>();
        }

    }
}
solução!

Consegui resolver, o problema é que eu estava tentando puxar os dados da seleção direto na página da home e como o HomeController não tinha o ProdutoDAO como @Autowired, eu instanciava ele com new ProdutoDAO() e por isso acabava vindo nulo.