Solucionado (ver solução)
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.

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