Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

(proposta) Melhoria para a solução

A solução proposta para o exercício trata o caso de um novo livro, mas não trata o caso de um livro sendo alterado e gera um efeito colateral de nova carga de todos os livros toda vez em que o método gravar é chamado. Uma sugestão mais elegante seria invalidar o cache de livros ao final do método "gravar", simplesmente fazendo o atributo que contém o cache ("livros") tornar a ser nulo. Os livros serão recarregados naturalmente na próxima vez em que forem necessários, através de uma chamada ao método "getLivros".

public List<Livro> getLivros() {
    if (null == livros) {
        livros = new DAO<Livro>(Livro.class).listaTodos();
    }
    return livros;
}

public void gravar() {
    System.out.println("Gravando o livro " + livro.getTitulo());

    if (livro.getAutores().isEmpty()) {
        FacesContext.getCurrentInstance().addMessage("autor",
                new FacesMessage("O livro deve ter pelo menos um Autor."));
        return;
    }

    DAO<Livro> dao = new DAO<Livro>(Livro.class);

    if (livro.getId() == null) {
        dao.adiciona(this.livro);
    } else {
        dao.atualiza(this.livro);
    }

    livro = new Livro();
    livros = null; // invalida o cache de livros, para que os novos dados sejam exibidos somente quando necessário.
}
1 resposta
solução!

Excelente solução, Alex! Parabéns!