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

Hibernate Excesso de Consultas

Nos capitulos 4 e 5, tenho feito e refeito as aulas e não consigo encontrar o que está acontecendo que pra cada produto encontrado o hibernate faz uma consulta também na tabela de categorias. Por fim, depois de terminar a aula 5 baixei o código fonte e substitui os modelos e o daos do meu projeto, porém o problema continua.

Alguma sugestão de porque isso está acontecendo?

Minha classe main:

public class CadastroDeProdutos {

    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> todos = produtoDao.buscarTodos();
        //List<Produto> todos = produtoDao.buscarPorNome("Xiaomi Redmi");
        //List<Produto> todos = produtoDao.buscarPorNomeDaCategoria("CELULARES");
        todos.forEach(p2 -> System.out.println(p2.getNome()));

    }

    private static void cadastrarProduto() {
        Categoria celulares = new Categoria("CELULARES");
        Produto celular = new Produto("Xiaomi Redmi","Muito Legal",new BigDecimal("800"),celulares);

        EntityManager em = JPAUtil.getEntityManager();
        ProdutoDao produtoDao = new ProdutoDao(em);
        CategoriaDao categoriaDao = new CategoriaDao(em);

        em.getTransaction().begin();

        categoriaDao.cadastrar(celulares);
        produtoDao.cadastrar(celular);

        em.getTransaction().commit();
        em.close();
    }

}

SQL Gerado no console:

Hibernate: 
    insert 
    into
        categorias
        (nome) 
    values
        (?)
Hibernate: 
    insert 
    into
        produtos
        (categoria_id, dataCadastro, descricao, nome, preco) 
    values
        (?, ?, ?, ?, ?)
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=?
800.00
Hibernate: 
    select
        produto0_.id as id1_1_,
        produto0_.categoria_id as categori6_1_,
        produto0_.dataCadastro as datacada2_1_,
        produto0_.descricao as descrica3_1_,
        produto0_.nome as nome4_1_,
        produto0_.preco as preco5_1_ 
    from
        produtos produto0_
Hibernate: 
    select
        categoria0_.id as id1_0_0_,
        categoria0_.nome as nome2_0_0_ 
    from
        categorias categoria0_ 
    where
        categoria0_.id=?
Hibernate: 
    select
        categoria0_.id as id1_0_0_,
        categoria0_.nome as nome2_0_0_ 
    from
        categorias categoria0_ 
    where
        categoria0_.id=?
Hibernate: 
    select
        categoria0_.id as id1_0_0_,
        categoria0_.nome as nome2_0_0_ 
    from
        categorias categoria0_ 
    where
        categoria0_.id=?
Xiaomi Redmi
Xiaomi Redmi
Xiaomi Redmi
Xiaomi Redmi
2 respostas

Claro, como eu fui esquecer do Lazy Load... Adicionei o fecth no modelo Produto e o problema parou, ele estava carregando as categorias por default.

@ManyToOne(fetch = FetchType.LAZY)

Porém por que mesmo com o professor não usando o fetch na notação, nas aulas deles não apareciam todas essas consultas de categoria no console?

solução!

Oi Ailton,

É isso mesmo do carregamento LAZY/EAGER que você mencionou.

Nas aulas no meu banco de dados tinha sempre um único registro e não disparava os selects separados, mas quando busquei o produto pelo nome ele fazia o join na mesma consulta para trazer os dados da categoria.

Bons estudos!