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

Listagem dos livros

Meu Bean está chamando o método "listar" 4x. Que pode estar acontecendo? Detalhe só há um livro cadastrado no banco.

lista.xhtml

<!DOCTYPE html>

<html
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets">

<h1>Lista De Livros</h1>
<hr/>

<h:dataTable var="livro" value="#{listaLivroBean.livros}">

    <h:column>
        <f:facet name="header">Titulo</f:facet>
        #{livro.titulo}
    </h:column>

    <h:column>
        <f:facet name="header">Subtitulo</f:facet>
        #{livro.subTitulo}
    </h:column>

    <h:column>
        <f:facet name="header">Descrição</f:facet>
        #{livro.descricao}
    </h:column>

    <h:column>
        <f:facet name="header">Qtde Páginas</f:facet>
        #{livro.qtdePaginas}
    </h:column>

    <h:column>
        <f:facet name="header">Preço</f:facet>
        #{livro.preco}
    </h:column>

    <h:column>
        <f:facet name="header">Data Lançamento</f:facet>
        #{livro.dataLancamento.time}
    </h:column>

    <h:column>
        <f:facet name="header">Autores</f:facet>
        <ui:repeat var="#{livro.autores}" value="autor">        
            #{autor.nome}
        </ui:repeat>
    </h:column>

</h:dataTable>

</html>

ListaLibroBean

package br.com.reis.casadocodigojavaee2.beans;

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

import javax.enterprise.inject.Model;
import javax.inject.Inject;

import br.com.reis.casadocodigojavaee2.daos.LivroDao;
import br.com.reis.casadocodigojavaee2.models.Livro;

@Model
public class ListaLivroBean {

    @Inject
    private LivroDao livroDao;

    private List<Livro> livros = new ArrayList<>();

    public List<Livro> getLivros() {
     this.livros = livroDao.listar();

     return livros;
    }

}

LivroDao

package br.com.reis.casadocodigojavaee2.daos;

import java.util.List;

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

import br.com.reis.casadocodigojavaee2.models.Livro;

public class LivroDao {

    @PersistenceContext
    private EntityManager entityManager;

    public void salvar(Livro livro) {
        entityManager.persist(livro);
    }

    public List<Livro> listar() {
        return entityManager.createQuery("select distinct(l) from Livro l join fetch l.autores", Livro.class).getResultList();
    }

}

console

17:03:01,143 INFO  [stdout] (default task-6) Fase: RESTORE_VIEW 1
17:03:01,146 INFO  [stdout] (default task-6) Fase: RENDER_RESPONSE 6
17:03:01,151 INFO  [stdout] (default task-6) Hibernate: 
17:03:01,151 INFO  [stdout] (default task-6)     select
17:03:01,151 INFO  [stdout] (default task-6)         distinct livro0_.id as id1_1_0_,
17:03:01,151 INFO  [stdout] (default task-6)         autor2_.id as id1_0_1_,
17:03:01,151 INFO  [stdout] (default task-6)         livro0_.dataLancamento as dataLanc2_1_0_,
17:03:01,152 INFO  [stdout] (default task-6)         livro0_.descricao as descrica3_1_0_,
17:03:01,152 INFO  [stdout] (default task-6)         livro0_.preco as preco4_1_0_,
17:03:01,152 INFO  [stdout] (default task-6)         livro0_.qtdePaginas as qtdePagi5_1_0_,
17:03:01,152 INFO  [stdout] (default task-6)         livro0_.subTitulo as subTitul6_1_0_,
17:03:01,152 INFO  [stdout] (default task-6)         livro0_.titulo as titulo7_1_0_,
17:03:01,152 INFO  [stdout] (default task-6)         autor2_.descricao as descrica2_0_1_,
17:03:01,152 INFO  [stdout] (default task-6)         autor2_.nome as nome3_0_1_,
17:03:01,152 INFO  [stdout] (default task-6)         autores1_.Livro_id as Livro_id1_2_0__,
17:03:01,152 INFO  [stdout] (default task-6)         autores1_.autores_id as autores_2_2_0__ 
17:03:01,153 INFO  [stdout] (default task-6)     from
17:03:01,153 INFO  [stdout] (default task-6)         Livro livro0_ 
17:03:01,153 INFO  [stdout] (default task-6)     inner join
17:03:01,153 INFO  [stdout] (default task-6)         Livro_Autor autores1_ 
17:03:01,153 INFO  [stdout] (default task-6)             on livro0_.id=autores1_.Livro_id 
17:03:01,153 INFO  [stdout] (default task-6)     inner join
17:03:01,153 INFO  [stdout] (default task-6)         Autor autor2_ 
17:03:01,153 INFO  [stdout] (default task-6)             on autores1_.autores_id=autor2_.id
17:03:01,159 INFO  [stdout] (default task-6) Hibernate: 
17:03:01,159 INFO  [stdout] (default task-6)     select
17:03:01,160 INFO  [stdout] (default task-6)         distinct livro0_.id as id1_1_0_,
17:03:01,160 INFO  [stdout] (default task-6)         autor2_.id as id1_0_1_,
17:03:01,160 INFO  [stdout] (default task-6)         livro0_.dataLancamento as dataLanc2_1_0_,
17:03:01,160 INFO  [stdout] (default task-6)         livro0_.descricao as descrica3_1_0_,
17:03:01,160 INFO  [stdout] (default task-6)         livro0_.preco as preco4_1_0_,
17:03:01,160 INFO  [stdout] (default task-6)         livro0_.qtdePaginas as qtdePagi5_1_0_,
17:03:01,160 INFO  [stdout] (default task-6)         livro0_.subTitulo as subTitul6_1_0_,
17:03:01,160 INFO  [stdout] (default task-6)         livro0_.titulo as titulo7_1_0_,
17:03:01,160 INFO  [stdout] (default task-6)         autor2_.descricao as descrica2_0_1_,
17:03:01,160 INFO  [stdout] (default task-6)         autor2_.nome as nome3_0_1_,
17:03:01,160 INFO  [stdout] (default task-6)         autores1_.Livro_id as Livro_id1_2_0__,
17:03:01,161 INFO  [stdout] (default task-6)         autores1_.autores_id as autores_2_2_0__ 
17:03:01,161 INFO  [stdout] (default task-6)     from
17:03:01,161 INFO  [stdout] (default task-6)         Livro livro0_ 
17:03:01,161 INFO  [stdout] (default task-6)     inner join
17:03:01,161 INFO  [stdout] (default task-6)         Livro_Autor autores1_ 
17:03:01,161 INFO  [stdout] (default task-6)             on livro0_.id=autores1_.Livro_id 
17:03:01,161 INFO  [stdout] (default task-6)     inner join
17:03:01,162 INFO  [stdout] (default task-6)         Autor autor2_ 
17:03:01,162 INFO  [stdout] (default task-6)             on autores1_.autores_id=autor2_.id
17:03:01,168 INFO  [stdout] (default task-6) Hibernate: 
17:03:01,168 INFO  [stdout] (default task-6)     select
17:03:01,168 INFO  [stdout] (default task-6)         distinct livro0_.id as id1_1_0_,
17:03:01,168 INFO  [stdout] (default task-6)         autor2_.id as id1_0_1_,
17:03:01,169 INFO  [stdout] (default task-6)         livro0_.dataLancamento as dataLanc2_1_0_,
17:03:01,169 INFO  [stdout] (default task-6)         livro0_.descricao as descrica3_1_0_,
17:03:01,169 INFO  [stdout] (default task-6)         livro0_.preco as preco4_1_0_,
17:03:01,169 INFO  [stdout] (default task-6)         livro0_.qtdePaginas as qtdePagi5_1_0_,
17:03:01,169 INFO  [stdout] (default task-6)         livro0_.subTitulo as subTitul6_1_0_,
17:03:01,169 INFO  [stdout] (default task-6)         livro0_.titulo as titulo7_1_0_,
17:03:01,169 INFO  [stdout] (default task-6)         autor2_.descricao as descrica2_0_1_,
17:03:01,169 INFO  [stdout] (default task-6)         autor2_.nome as nome3_0_1_,
17:03:01,169 INFO  [stdout] (default task-6)         autores1_.Livro_id as Livro_id1_2_0__,
17:03:01,169 INFO  [stdout] (default task-6)         autores1_.autores_id as autores_2_2_0__ 
17:03:01,169 INFO  [stdout] (default task-6)     from
17:03:01,169 INFO  [stdout] (default task-6)         Livro livro0_ 
17:03:01,169 INFO  [stdout] (default task-6)     inner join
17:03:01,169 INFO  [stdout] (default task-6)         Livro_Autor autores1_ 
17:03:01,169 INFO  [stdout] (default task-6)             on livro0_.id=autores1_.Livro_id 
17:03:01,169 INFO  [stdout] (default task-6)     inner join
17:03:01,169 INFO  [stdout] (default task-6)         Autor autor2_ 
17:03:01,170 INFO  [stdout] (default task-6)             on autores1_.autores_id=autor2_.id
3 respostas
solução!

Carlos,

para evitar essa chamada repetida e sem necessidade, você pode adicionar uma verificação no método getLivros() para que ele só seja chamado caso a lista esteja nula.

public List<Livro> getLivros() {
    this.livros = livroDao.listar();
    return livros;
}

Assim:

public List<Livro> getLivros() {
    if (this.livros == null) {
        this.livros = livroDao.listar();
    }
    return livros;
}

Importante observar que a cada alteração na sua lista, você precisa setar a lista de livros para null. Algo assim:

 public void salvar(Livro livro) {
    entityManager.persist(livro);
    this.lista = null; // insira essa linha após os persist(), merge() e remove()
}

Verifica se ainda ocorrem as chamadas desnecessárias.

Abraço.

Fala Carlos, tudo bem? é isso que o Manoel falou vc precisa fazer uma verificação no getLivros. O que acontece é que durante o ciclo de vida no JSF ele chama diversas vezes os métodos get e set que estão bindados na view e no Managed Bean e como no método getLivros você está fazendo uma consulta no banco isso acaba ficando muito caro para aplicação.

A única coisa que eu faria diferente é a verificação. O seu método salva não precisa settar a lista como null, isso é um pouco ruim em termos de aplicação.

No seu getLivro você pode fazer uma verificação assim:

public List<Livro> getLivros() {
    if (this.livros.isEmpty()) {
        this.livros = livroDao.listar();
    }
    return livros;
}

e no método salva:

 public void salvar(Livro livro) {
    entityManager.persist(livro);
    this.lista =  livroDao.listar(); 
}

Dessa forma vc evita tomar um NullPointerException em algumas situações.

Espero ter ajudado =)

Boa Manoel/Samir, obrigado!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software