Erro em Select Com Ajax

tenho 3 combos aninhados,
um filtrando o outro
marca >produto> modelo

marca para produto o filtro ocorre normal
mais de produto para modelo ele gera este erro

org.hibernate.TransientObjectException: object references an unsaved
transient instance - save the transient instance before flushing

pesquise sobre hibernate lazy pode ser isso.

nao e a lazy ja verifiquei isto

Essa exceção ocorre quando você tenta salvar um objeto que possui relacionamento com outro e, este outro ainda não foi persistido.
Exemplo, pense que o objeto a da classe A possui um atributo b que é objeto da classe B. Como b agrega o objeto a (ou o compõe), ele precisa ser persistido antes do momento em que você tente salvar o objeto a.

public class B{
//atributos
//getters e setters
}

public class A{
    private B b;
    //getters e setters
}

Se você não salvar o objeto de B ou não mudar o cascade de A, continuará ter problemas.

drsmachado

um produto contem um demolo

mais eu estou fazendo busca no banco, como disse acima um select com ajax
esta regra tbm se aplica?

qual tipo de cascate vc me indica ausar?

Então existe um problema bem sério aí no teu sistema, pois, select não deveria fazer update/insert, que é o que dispara o erro que você está tendo.

drsmachado vo colocar o codigo pra vc ter uma visão maior od meu problema

XHTML

   <h:panelGrid columns="2" columnClasses="label, value" styleClass="grid">
						   		<h:outputText value="Marca: " />
						 		<h:selectOneMenu id="marca" value="#{processobean.marcaSelecionada}"
						 						 converter="converterMarca" items="#{processobean.listaMarca}">
						 			<f:selectItem itemLabel="Selecione" />
						 			<f:selectItems value="#{processobean.listaMarca}" var="marca"
						 			 				itemValue="#{marca}" itemLabel="#{marca.marca}"/>
						 			<f:ajax render="produto" event="valueChange" listener="#{processobean.produtoMarca()}"/>
						 		</h:selectOneMenu>
						 		
						 		<h:outputText value="Produto: " />
						 		<h:selectOneMenu id="produto" value="#{processobean.produtoSelecionado}"
						 						 converter="converterProduto" items="#{processobean.produtoMarca()}">
						 			<f:selectItems value="#{processobean.produtoMarca()}" var="produto"
						 			 				itemValue="#{produto}" itemLabel="#{produto.produto}"/>
						 		  	<f:ajax update="modelo" event="valueChange" listener="#{processobean.modeloProduto()}"/> 
						 		</h:selectOneMenu>
						  	
						 		<h:outputText value="Modelo: " />
						 		<h:selectOneMenu id="modelo" value="#{processobean.modeloSelecionado}"
						 						 converter="converterModelo" items="#{processobean.modeloProduto()}" >
						 			<f:selectItems value="#{processobean.modeloProduto()}" var="modelo"
						 							 itemValue="#{modelo}" itemLabel="#{modelo.modelo}"/>
						 		</h:selectOneMenu>
						 			 
						 		<h:outputText value="Defeito: " />
						 		<h:selectOneMenu id="defeitoFild" value="#{processobean.defeitoSelecionado}"
						 						 converter="converterDefeito">
						 			<f:selectItem itemLabel="Selecione" />
						 			<f:selectItems value="#{processobean.defeitoProduto()}" var="defeito"
						 			 				itemValue="#{defeito}" itemLabel="#{defeito.defeito}"/>
						 		</h:selectOneMenu>
						 		 
						   </h:panelGrid>   

Meu Bean

package visao;

import implementacoes.InterfaceBean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

import org.primefaces.event.FlowEvent;
import org.primefaces.event.RowEditEvent;

import dao.ClienteDao;
import dao.DefeitoDao;
import dao.MarcaDao;
import dao.ModeloDao;
import dao.ProdutoDao;
import entidade.Cliente;
import entidade.Defeito;
import entidade.Marca;
import entidade.Modelo;
import entidade.Processo;
import entidade.Produto;

@ManagedBean(name="processobean")
@RequestScoped
public class ProcessoBean implements Serializable,InterfaceBean {

	/**
	 * 
	 */
	private static final long serialVersionUID = 8197375602768731410L;

	private Marca marcaSelecionada ;
	private Produto produtoSelecionado ;
	private Cliente clienteSelecionado;
	private Modelo modeloSelecionado;
	private Cliente cliente = new Cliente();
	private Defeito defeitoSelecionado ;
	private Processo processo = new Processo();
	private static Logger logger = Logger.getLogger(ProcessoBean.class.getName());  
	private List<Object> listaCliente;
	private List<Object> listaDefeito;
	private List<Object> listaModelo;
	private List<Object> listaMarca;
	private List<Object> listaProduto;
	private boolean skip;
	
	
	@PostConstruct
	public void init(){
		listaMarca =  new MarcaDao().listaMarca();
	}
	
	public List<Object> produtoMarca() {
		if (listaProduto == null) {
			listaProduto = new ProdutoDao().produtoMarca(marcaSelecionada);
		}
		return this.listaProduto;
	}
	
	public List<Object> modeloProduto(){
		if (listaModelo == null) {
			listaModelo = (ArrayList<Object>) new ModeloDao().modeloProduto(produtoSelecionado);
		}
		return listaModelo;
	}
	
	public List<Object> defeitoProduto(){
		listaDefeito = (ArrayList<Object>) new DefeitoDao().defeitoProduto(produtoSelecionado);
		return listaDefeito;
	}
	
	public List<Object> listarObject() {
		return null;
	}

	@Override
	public Object prepararAdicionarObject() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void editObject(RowEditEvent event) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public String deleteObject(RowEditEvent event) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void saveObject() {
		processo.setDefeito(defeitoSelecionado);
	}
	
	public String onFlowProcess(FlowEvent event) {  
		logger.info("Current wizard step:" + event.getOldStep());  
        logger.info("Next step:" + event.getNewStep());  
          
        if(skip) {  
            skip = false;   //reset in case user goes back  
            return "confirm";  
        }  
        else {  
            return event.getNewStep();  
        }   
	}  

	public List<Object> getListaCliente() {
		if (listaCliente == null) {
			listaCliente = (ArrayList<Object>) new ClienteDao().listaCliente();
		}
		
		return this.listaCliente;
	}

	public void setListaCliente(List<Object> listaCliente) {
		this.listaCliente = listaCliente;
	}
	
	public List<Object> getListaDefeito() {
		if (listaDefeito == null) {
			listaDefeito = (ArrayList<Object>) new DefeitoDao().listaDefeito();
		}
		
		return this.listaCliente;
	}
	
	public List<Object> getListaModelo() {
		if (listaModelo == null) {
			listaModelo = (ArrayList<Object>) new ModeloDao().listaModelo();
		}
		
		return this.listaModelo;
	}

	public void setListaDefeito(List<Object> listaDefeito) {
		this.listaDefeito = listaDefeito;
	}
	
	public void setListaModelo(List<Object> listaModelo) {
		this.listaModelo = listaModelo;
	}
	
	public Processo getProcesso() {
		return processo;
	}
	
	public Defeito getDefeitoSelecionado() {
		return defeitoSelecionado;
	}

	public void setDefeitoSelecionado(Defeito defeitoSelecionado) {
		this.defeitoSelecionado = defeitoSelecionado;
	}

	public void setProcesso(Processo processo) {
		this.processo = processo;
	}

	public Cliente getClienteSelecionado() {
		return clienteSelecionado;
	}

	public void setClienteSelecionado(Cliente clienteSelecionado) {
		this.clienteSelecionado = clienteSelecionado;
	}

	public boolean isSkip() {
		return skip;
	}

	public void setSkip(boolean skip) {
		this.skip = skip;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public Modelo getModeloSelecionado() {
		return modeloSelecionado;
	}

	public void setModeloSelecionado(Modelo modeloSelecionado) {
		this.modeloSelecionado = modeloSelecionado;
	}

	public Marca getMarcaSelecionada() {
		return marcaSelecionada;
	}

	public void setMarcaSelecionada(Marca marcaSelecionada) {
		this.marcaSelecionada = marcaSelecionada;
	}

	public Produto getProdutoSelecionado() {
		return produtoSelecionado;
	}

	public void setProdutoSelecionado(Produto produtoSelecionado) {
		this.produtoSelecionado = produtoSelecionado;
	}

	public static Logger getLogger() {
		return logger;
	}

	public static void setLogger(Logger logger) {
		ProcessoBean.logger = logger;
	}

	public List<Object> getlistaMarca() {
		return listaMarca;
	}

	public void setListaMarca(List<Object> listaMarca) {
		this.listaMarca = listaMarca;
	}

	public List<Object> getListaProduto() {
		return listaProduto;
	}

	public void setListaProduto(List<Object> listaProduto) {
		this.listaProduto = listaProduto;
	}



}

e meu Dao de modelo

package dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import conexao.Conexao;
import entidade.Modelo;
import entidade.Produto;

/**
 * Classe dao do Usuario ele gera uma lista de todos os usuarios cadastrados no banco e procura um usuario especifico.
 * Como faz conexão com o banco e sai da JVM implementa Serializable.
 * @author Rangel
 * @version 1.0
 * @since 25/09/2012
 * @see java.lang.Object
 * @see java.io.Serializable
 */
public class ModeloDao implements Serializable {

	/**
	 *numero gerado aleatoriamente pela Serializable 
	 *@serial serialVersionUID
	 */
	private static final long serialVersionUID = 1393220123258638465L;

	private final Session session;

	/**
	 * construtor ObjectDao instacia um objeto session com uma nova conexão
	 */
	public ModeloDao() {
		this.session = Conexao.getSession();
	}


	/**
	 * Criar uma lista de marca e a preenche com os dados do banco
	 * @return listausuario lista de usuarios ja preenchida	
	 */
	public List<Object> listaModelo(){
		Transaction tx = session.beginTransaction();
		Query query = session.createQuery("FROM Modelo");
		@SuppressWarnings("unchecked")
		List<Object> listaModelo =  query.list();
		session.close();
		tx.commit();
		return listaModelo;
	}

	/**
	 * Recebe um id por parametro  e busca o respectivo Usuario no banco de dados.
	 * @param id o id
	 */
	public Modelo find(long id){
		return(Modelo) session.load(Modelo.class, id);
	}
	
	public List<Object> modeloProduto(Produto produto){
		Criteria crit = this.session.createCriteria(Modelo.class);
		crit.add(Restrictions.eq("produto", produto));
		@SuppressWarnings("unchecked")
		List<Object> listaModeloProduto = crit.list();
		return listaModeloProduto;
	}
	
}

No lista modelo você está dando um commit na transação e não precisa disso. E pior, está tentando fazer isso após fechar a sessão.

mais isto eu fiz so pra desencargo de consciência, eu ja tinha tentado do modo normal e persssitiu o erro
fiz isto sei la , pra tentar

help?

galera ?

vish
alguem?