Saudações pessoal
Estou a desenvolver um projecto e preciso fazer select one menus em cascata, ao escolher a marca do produto, ele deve preencher os modelos dessa marca, mas quando escolho a marca é lançada a seguinte excepção:
Hibernate:
select
marca0_.id as id1_3_,
marca0_.nome as nome2_3_
from
marca marca0_
Hibernate:
select
marca0_.id as id1_3_0_,
marca0_.nome as nome2_3_0_
from
marca marca0_
where
marca0_.id=?
Hibernate:
select
marca0_.id as id1_3_,
marca0_.nome as nome2_3_
from
marca marca0_
Hibernate:
select
marca0_.id as id1_3_,
marca0_.nome as nome2_3_
from
marca marca0_
Hibernate:
select
modelo0_.id as id1_4_,
modelo0_.marca_id as marca_id3_4_,
modelo0_.nome as nome2_4_
from
modelo modelo0_
where
modelo0_.marca_id=?
Aug 18, 2017 3:10:26 PM com.sun.faces.lifecycle.InvokeApplicationPhase execute
WARNING: /CadastraProduto.xhtml @31,101 listener="#{cadastraProdutoBean.carregarModelos()}": java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance beforeQuery flushing: mz.co.mozpricerunner.model.Marca
javax.el.ELException: /CadastraProduto.xhtml @31,101 listener="#{cadastraProdutoBean.carregarModelos()}": java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance beforeQuery flushing: mz.co.mozpricerunner.model.Marca
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:111)
at org.primefaces.behavior.ajax.AjaxBehaviorListenerImpl.processAjaxBehavior(AjaxBehaviorListenerImpl.java:60)
at javax.faces.event.AjaxBehaviorEvent.processListener(AjaxBehaviorEvent.java:113)
at javax.faces.component.behavior.BehaviorBase.broadcast(BehaviorBase.java:106)
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:805)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:217)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance beforeQuery flushing: mz.co.mozpricerunner.model.Marca
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:144)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1419)
at org.hibernate.query.Query.getResultList(Query.java:146)
at mz.co.mozpricerunner.repository.ModeloRepository.findByMarca(ModeloRepository.java:45)
at mz.co.mozpricerunner.controller.CadastraProdutoBean.carregarModelos(CadastraProdutoBean.java:50)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.el.parser.AstValue.invoke(AstValue.java:247)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267)
at org.jboss.weld.module.web.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
at org.jboss.weld.module.web.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
… 31 more
Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance beforeQuery flushing: mz.co.mozpricerunner.model.Marca
at org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:279)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:462)
at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:161)
at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:53)
at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:628)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1956)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1909)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1887)
at org.hibernate.loader.Loader.doQuery(Loader.java:932)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:349)
at org.hibernate.loader.Loader.doList(Loader.java:2615)
at org.hibernate.loader.Loader.doList(Loader.java:2598)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2430)
at org.hibernate.loader.Loader.list(Loader.java:2425)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:502)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:375)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1481)
at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1441)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1410)
… 43 more
Aug 18, 2017 3:10:26 PM com.sun.faces.context.AjaxExceptionHandlerImpl handlePartialResponseError
SEVERE: java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance beforeQuery flushing: mz.co.mozpricerunner.model.Marca
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:144)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1419)
at org.hibernate.query.Query.getResultList(Query.java:146)
at mz.co.mozpricerunner.repository.ModeloRepository.findByMarca(ModeloRepository.java:45)
at mz.co.mozpricerunner.controller.CadastraProdutoBean.carregarModelos(CadastraProdutoBean.java:50)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.el.parser.AstValue.invoke(AstValue.java:247)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267)
at org.jboss.weld.module.web.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
at org.jboss.weld.module.web.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at org.primefaces.behavior.ajax.AjaxBehaviorListenerImpl.processAjaxBehavior(AjaxBehaviorListenerImpl.java:60)
at javax.faces.event.AjaxBehaviorEvent.processListener(AjaxBehaviorEvent.java:113)
at javax.faces.component.behavior.BehaviorBase.broadcast(BehaviorBase.java:106)
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:805)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:217)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance beforeQuery flushing: mz.co.mozpricerunner.model.Marca
at org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:279)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:462)
at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:161)
at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:53)
at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:628)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1956)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1909)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1887)
at org.hibernate.loader.Loader.doQuery(Loader.java:932)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:349)
at org.hibernate.loader.Loader.doList(Loader.java:2615)
at org.hibernate.loader.Loader.doList(Loader.java:2598)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2430)
at org.hibernate.loader.Loader.list(Loader.java:2425)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:502)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:375)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1481)
at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1441)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1410)
… 43 more
A minha entidade produto
package mz.co.mozpricerunner.model;
import java.io.Serializable;
import java.math.BigDecimal;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
@Entity
@Table(name = “produto”)
public class Produto implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String nome;
private BigDecimal preco;
private ProdutoCategoria produtoCategoria;
private String descricao;
private String cor;
private Modelo modelo = new Modelo();
public Produto() {
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@NotNull
@Column(name = "produto_categoria", nullable = false)
public ProdutoCategoria getProdutoCategoria() {
return produtoCategoria;
}
public void setProdutoCategoria(ProdutoCategoria produtoCategoria) {
this.produtoCategoria = produtoCategoria;
}
//@NotNull
@ManyToOne (cascade = CascadeType.ALL)
@JoinColumn(name = "modelo_id")
public Modelo getModelo() {
return modelo;
}
public void setModelo(Modelo modelo) {
this.modelo = modelo;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
@Column(precision = 2, nullable = false)
public BigDecimal getPreco() {
return preco;
}
public void setPreco(BigDecimal preco) {
this.preco = preco;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public String getCor() {
return cor;
}
public void setCor(String cor) {
this.cor = cor;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Produto other = (Produto) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
}
A minha entidade Modelo
import java.io.Serializable;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.NotEmpty;
@Entity
@Table (name = “modelo”)
public class Modelo implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String nome;
private Marca marca = new Marca();
public Modelo() {}
@Id
@GeneratedValue (strategy = GenerationType.AUTO)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@NotEmpty
@Column (nullable = false, unique = true)
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
@NotNull
@ManyToOne (cascade = CascadeType.ALL)
@JoinColumn (name = "marca_id")
public Marca getMarca() {
return marca;
}
public void setMarca(Marca marca) {
this.marca = marca;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Modelo other = (Modelo) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
}
A minha Entidade Marca
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.validator.constraints.NotEmpty;
@Entity
@Table (name = “marca”)
public class Marca implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String nome;
public Marca(){}
@Id
@GeneratedValue (strategy = GenerationType.AUTO)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@NotEmpty
@Column (nullable = false, length = 30, unique = true)
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Marca other = (Marca) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
}
O método que busca modelos em função de uma marca, que está no repositório de Modelos
public List findByMarca(Marca marca) {
String jpql = "select m from Modelo m where m.marca = :marca";
TypedQuery<Modelo> query = manager.createQuery(jpql, Modelo.class);
query.setParameter("marca", marca);
List<Modelo> modelos = query.getResultList();
return modelos;
}
O converter do Modelo
@FacesConverter(forClass = Modelo.class)
public class ModeloConverter implements Converter {
@Inject
private ModeloRepository modeloRepository;
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String value) {
Modelo modelo = null;
if (value != null && !"".equals(value)) {
modelo = this.modeloRepository.findById(new Integer(value));
}
return modelo;
}
@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object value) {
if (value != null) {
Modelo modelo = ((Modelo) value);
return modelo.getId() == null ? null : modelo.getId().toString();
}
return null;
}
}
O converter da Marca
@FacesConverter(forClass = Marca.class)
public class MarcaConverter implements Converter {
@Inject
private MarcaRepository marcaRepository;
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String value) {
Marca marca = null;
if (value != null && !"".equals(value)) {
marca = this.marcaRepository.findById(new Integer(value));
}
return marca;
}
@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object value) {
if (value != null) {
Marca marca = ((Marca) value);
return marca.getId() == null ? null : marca.getId().toString();
}
return null;
}
}
O Managed Bean de cadastro de produto
package mz.co.mozpricerunner.controller;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import mz.co.mozpricerunner.model.Marca;
import mz.co.mozpricerunner.model.Modelo;
import mz.co.mozpricerunner.model.Produto;
import mz.co.mozpricerunner.model.ProdutoCategoria;
import mz.co.mozpricerunner.repository.MarcaRepository;
import mz.co.mozpricerunner.repository.ModeloRepository;
@Named
@ViewScoped
public class CadastraProdutoBean implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private MarcaRepository marcaRepository;
@Inject
private ModeloRepository modeloRepository;
private Produto produto = new Produto();
private List<Marca> marcas = new ArrayList<>();
private List<Modelo> modelos = new ArrayList<>();
public Produto getProduto() {
return produto;
}
public void setProduto(Produto produto) {
this.produto = produto;
}
public void carregarModelos() {
if (produto != null) {
if (produto.getModelo() != null) {
if (produto.getModelo().getMarca() != null) {
modeloRepository.findByMarca(produto.getModelo().getMarca());
}
}
}
}
public List<Marca> getMarcas() {
if (this.marcas.isEmpty())
marcas = marcaRepository.findAll();
return marcas;
}
public List<Modelo> getModelos() {
return modelos;
}
public ProdutoCategoria[] getCategorias() {
return ProdutoCategoria.values();
}
}
O código da página xhtml
<h:form>
<div class="ui-fluid">
<p:panelGrid columns="4" layout="grid"
columnClasses="ui-grid-col-2, ui-grid-col-4, ui-grid-col-2, ui-grid-col-4"
styleClass="ui-noborder">
<p:outputLabel for="nome" value="Nome" />
<p:inputText id="nome" value="#{cadastraProdutoBean.produto.nome}" />
<p:outputLabel for="preco" value="Preço" />
<p:inputText id="preco" value="#{cadastraProdutoBean.produto.preco}" />
<p:outputLabel for="marca" value="Marca" />
<p:selectOneMenu id="marca" value="#{cadastraProdutoBean.produto.modelo.marca}">
<f:selectItem itemLabel="Escolha a Marca" noSelectionOption="true" />
<f:selectItems value="#{cadastraProdutoBean.marcas}" var="marca"
itemValue="#{marca}" itemLabel="#{marca.nome}"/>
<p:ajax update="modelo" listener="#{cadastraProdutoBean.carregarModelos()}" process="@this" />
</p:selectOneMenu>
<p:outputLabel for="modelo" value="Modelo" />
<p:selectOneMenu id="modelo" value="#{cadastraProdutoBean.produto.modelo}">
<f:selectItem itemLabel="Escolha o Modelo"
noSelectionOption="true" />
</p:selectOneMenu>
<p:outputLabel for="categoria" value="Categoria" />
<p:selectOneMenu id="categoria" value="#{cadastraProdutoBean.produto.produtoCategoria}">
<f:selectItem itemLabel="Escolha a Categoria"
noSelectionOption="true" />
<f:selectItems value="#{cadastraProdutoBean.categorias}"
var="categoria" itemValue="#{categoria}"
itemLabel="#{categoria.descricao}" />
</p:selectOneMenu>
<p:outputLabel for="cor" value="Cor" />
<p:selectOneMenu id="cor" value="#{cadastraProdutoBean.produto.cor}">
<f:selectItem itemLabel="Escolha a Cor" noSelectionOption="true" />
</p:selectOneMenu>
<p:outputLabel for="descricao" value="Descrição" />
<p:inputTextarea id="descricao" value="#{cadastraProdutoBean.produto.descricao}" />
</p:panelGrid>
</div>
<p:commandButton value="Cadastrar" icon="ui-icon-disk" />
</h:form>
Conto com a vossa ajuda meus caros.