1
resposta

Arro ao gravar o autor, no CRUD de Livros

Após preencher os dados de um novo livro e selecionar um autor, ao clicar em gravar autor é retornada a seguinte exceção:

Caused by: java.lang.IllegalArgumentException: id to load is required for loading
    at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:87)
    at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:59)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2421)
    at org.hibernate.internal.SessionImpl.get(SessionImpl.java:974)
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:807)
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:781)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.jboss.weld.bean.proxy.AbstractBeanInstance.invoke(AbstractBeanInstance.java:38)
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:100)
    at org.jboss.weld.proxies.EntityManager$131884212$Proxy$_$$_WeldClientProxy.find(Unknown Source)
    at br.com.caelum.livraria.dao.DAO.buscaPorId(DAO.java:60)
    at br.com.caelum.livraria.dao.AutorDao.buscaPorId(AutorDao.java:39)
    at br.com.caelum.livraria.bean.LivroBean.gravarAutor(LivroBean.java:91)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:247)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267)
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)

Os códigos envolvidos podem ser visualizados no em: https://gist.github.com/anonymous/a9225efcd0d6736ebedd411d388bf8a9

Obrigado!

1 resposta

Oi Claudio,

A principio o problema está no XHTML, nesse trecho:

<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">

Olhando o código está tudo ok, mas quando você clica no botão "Gravar Autor" ele não está enviando na requisição o ID do Autor escolhido na combo-box.

Faz a seguinte alteração e veja se resolve:

<p:commandButton value="Gravar Autor" action="#{livroBean.gravarAutor}" process="@form" update="tabelaAutores">

Repare que alterei o atributo process, indicando ao JSF que submeta na requisição todos os parametros do formulário.

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