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