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.
}