Select One Menu em Cascata JSF e Primefaces

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.