Para o instrutor do curso Java EE:
Primeiro, parabéns pelo nascimento do seu filho, que ele tenha vida longa e próspera.
Segundo, parabéns pelos cursos de Spring MVC I e II, realmente muito bons.
Terceiro, parabéns pelo curso Java EE que estou fazendo agora, muito bom também.
Sobre esse último, gostaria de sugerir a utilização do Omnifaces, pois o objetivo desse é facilitar a vida do programador Java EE JSF.
Fiz somente o seguinte passo a passo para a conversão de autor funcionar corretamente:
i) acrescentei a dependência do Omnifaces no pom.xml:
<dependency>
<groupId>org.omnifaces</groupId>
<artifactId>omnifaces</artifactId>
<version>2.5.1</version>
</dependency>
ii) no form.xhtml usei o conversor do Omnifaces omnifaces.SelectItemsConverter:
<div>
<h:outputLabel value="Autores" />
<h:selectManyListbox value="#{adminLivrosBean.livro.autores}"
converter="omnifaces.SelectItemsConverter" id="autores">
<f:selectItems value="#{adminLivrosBean.autores}"
var="autor"
itemValue="#{autor}" itemLabel="#{autor.nome}" />
</h:selectManyListbox>
<h:message for="autores" />
</div>
iii) usei o método toString recomendado pelo Omnifaces na entidade Autor:
@Override
public String toString() {
return String.format("%s[id=%d]", getClass().getSimpleName(),
getId());
}
iv) por último, usei os métodos equals e hash também, conforme você já havia mostrado.
A solução que você apresentou é realmente muito interessante mas considero importante mostrar também essa alternativa.
Na aula 5, sugiro a utilização do componente do Omnifaces o:inputFile pois aceita validação dos atributos accept e maxsize, assim o desenvolvedor poderá restringir o tipos de arquivos que podem ser aceitos e restringir o tamanho máximo do arquivo, além de pode escolher múltiplos arquivos.
Meus parabéns pela Aula 6 também ;-), bastante interessante. Vale mencionar que o Omnifaces tem um FileServlet também, baseado no FileServlet do BalusC (http://balusc.omnifaces.org/2009/02/fileservlet-supporting-resume-and.html).