Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
10
respostas

Lista de autores relacionados ao livro não aparece!

Olá, quando eu clico no botão Gravar Autor não é apresentado o nome do autor abaixo como mostrado no vídeo 2 da aula 4. Segue o xhtml:

            <p:fieldset legend="Dados do Autor">
                <p:panelGrid columns="4">

                    <p:outputLabel value="Selecione Autor:" for="autor" />
                    <p:selectOneMenu value="#{livroBean.autorId}" id="autor">
                        <f:selectItems value="#{livroBean.autores}" var="autor"
                            itemLabel="#{autor.nome}" itemValue="#{autor.id}" />
                    </p:selectOneMenu>
                    <p:commandButton value="Gravar Autor"
                        action="#{livroBean.gravarAutor}" process="@this autor"
                        update="tabelaAutores" />
                    <p:commandLink value=" ou Cadastrar novo autor"
                        action="#{livroBean.formAutor}" immediate="true" update="@all" />
                </p:panelGrid>

                <h:dataTable value="#{livroBean.autoresDoLivro}" var="autor"
                    id="tabelaAutores">
                    <h:column>
                        <h:outputText value="#{autor.nome}" />
                    </h:column>

                    <h:column>
                        <h:commandButton value="X"
                            action="#{livroBean.removerAutorDoLivro(autor)}" />
                    </h:column>
                </h:dataTable>

            </p:fieldset>
10 respostas

CommandLink atualizado: (porém não funcionando ainda)

<p:column>
        <p:commandLink value="X" action="#{livroBean.removerAutorDoLivro(autor)}" process="@this" update="tabelaAutores"/>
</p:column>

Eduardo

o seu dataTable continua JSF padrão, pq você não muda para o dataTable do Primefaces ??

<p:dataTable value="#{livroBean.autoresDoLivro}" var="autor" 
    id="tabelaAutores" emptyMessage="Nenhum autor">
    <p:column>
        <h:outputText value="#{autor.nome}" />
    </p:column>
    <p:column>
        <p:commandLink value="X" action="#{livroBean.removerAutorDoLivro(autor)}" 
            update="tabelaAutores" process="@this" />
    </p:column>
</p:dataTable>

Já tinha mudado, Jefferson. Porém continua não funcionando :/

Ok, você ja viu no banco de dados se o autor é inserido normalmente e só a tela não atualiza ??

Não tinha visto, ele não está salvando no banco.


    // METODO gravar autor
    public void gravarAutor() {
        Autor autor = new DAO<Autor>(Autor.class).buscaPorId(this.autorId);
        if (autor == null) {
            this.livro.adicionaAutor(autor);
        } else {
            new DAO<Autor>(Autor.class).atualiza(autor);
        }
        System.out.println("Livro do autor " + autor.getNome());
    }
// METODO gravar livro
    public void gravar() {

        if (livro.getAutores().isEmpty()) {
            FacesContext.getCurrentInstance().addMessage("autor",
                    new FacesMessage("Livro deve ter pelo menos um Autor."));
            return;
        }
        DAO<Livro> dao = new DAO<Livro>(Livro.class);

        if (this.livro.getId() == null) {
            new DAO<Livro>(Livro.class).adiciona(this.livro);
            System.out.println("Gravando livro " + this.livro.getTitulo());

            this.livros = dao.listaTodos();
        } else {
            new DAO<Livro>(Livro.class).atualiza(this.livro);
        }
        this.livro = new Livro();
    }

    public RedirectView formAutor() {
        return new RedirectView("autor");

    }

Mas pelo menos esta entrando no metodo ?? É retornado a mensagem no console com o nome do autor que se deseja gravar ??

solução!

utilize o seguinte gravarAutor para ver se funciona

    public void gravarAutor() {
        Autor autor = new DAO<Autor>(Autor.class).buscaPorId(this.autorId);
        this.livro.adicionaAutor(autor);
    }

Valeu Jefferson, com esse método funcionou. Mas agora ele não fará a verificação se o autor existe ou não? Fiz um teste e ele atualizou normalmente, mas como ele fez isso se tirei a verficação?

Eduardo,

o autor tem que existir pois você o escolhe pelo combobox cujo itens são preenchidos apenas por autores cadastrados na tabela de autores.

Entendi. Valeu Jefferson.