ERRO Hibernate

[size=18]Galera Obrigado Problema Resolvido[/size]

Oi galera sou novo com hibernate e estou com um problema no meu sistema.

consigo cadastrar novos registros mas quando mando alterar recebo a mensagem de erro abaixo.

ERRO - illegal attempt to associate a collection with two open sessions

segue abaixo o codigo

[code]package hibernate;

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;

public class HibernateUtil {
private static final SessionFactory sessionFactory;

static {
    try {
        sessionFactory = new AnnotationConfiguration().configure("config/hibernate.cfg.xml").buildSessionFactory();
    } catch (Throwable ex) {
        System.err.println("Initial SessionFactory creation failed." + ex);
        throw new ExceptionInInitializerError(ex);
    }
}

public static SessionFactory getSessionFactory() {
    return sessionFactory;
}

}
[/code]

[code]<?xml version="1.0" encoding="UTF-8"?>

org.hibernate.dialect.MySQLDialect com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/transporteescolar root al1206
<mapping class="modelo.Aluno"/>
<mapping class="modelo.Fornecedor"/>
<mapping class="modelo.Colegio"/>
<mapping class="modelo.Carro"/>
<mapping class="modelo.ContasAPagar"/>
<mapping class="modelo.Endereco"/>
<mapping class="modelo.ItemNota"/>
<mapping class="modelo.Itinerario"/>
<mapping class="modelo.Mensalidade"/>
<mapping class="modelo.NotaFiscal"/>
<mapping class="modelo.ReceitaDespesa"/>
<mapping class="modelo.Responsavel"/>
<mapping class="modelo.TelefoneAluno"/>
<mapping class="modelo.TelefoneResponsavel"/>
<mapping class="modelo.TelefoneColegio"/>
<mapping class="modelo.TelefoneFornecedor"/>
<mapping class="modelo.Usuario"/>
[/code]

[code]package control;

import java.util.*;
import modelo.Carro;
import persistence.CarroDao;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

public class ManterCarro {

private Carro carro;
private List<Carro> dados = new ArrayList();
private boolean listaVazia = true;
private CarroDao cd = new CarroDao();

public ManterCarro() {

    carro = new Carro();
    try {            
        listaVazia = (cd.listarAtivo().isEmpty()) ? true : false;            
    } catch (Exception ex) {
        ex.printStackTrace();
    }

}

public Carro getCarro() {
    return carro;
}

public void setCarro(Carro carro) {
    this.carro = carro;
}

public List<Carro> getDados() {

    try {
        if (cd.listarAtivo().isEmpty()) {
            listaVazia = true;                
        } else {
            listaVazia = false;
            dados = cd.listarAtivo();                
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return dados;
}

public void setDados(List<Carro> dados) {
    this.dados = dados;
}

public boolean isListaVazia() {
    return listaVazia;
}

public void setListaVazia(boolean listaVazia) {
    this.listaVazia = listaVazia;
}

public void cadastrar() {

    FacesContext context = FacesContext.getCurrentInstance();
    String mensagem = "";

    try {
        carro.setAtivo(true);
        cd.salvar(carro);            
        dados.add(carro);
        carro = new Carro();
        listaVazia = false;

        mensagem = "Carro cadastrado com sucesso!";
        FacesMessage message = new FacesMessage(mensagem);
        context.addMessage("formulario", message);

    } catch (Exception exp) {

        mensagem = "Erro: " + exp.getMessage();
        FacesMessage message = new FacesMessage(mensagem);
        context.addMessage("formulario", message);

    }

}

public void limpar() {
    carro = new Carro();

}   

public void excluir(ActionEvent event) throws Exception {

    FacesContext context = FacesContext.getCurrentInstance();
    String mensagem = "";
    UIParameter parameter = (UIParameter) event.getComponent().
            findComponent("itemdel");

    Carro c = (Carro) parameter.getValue();

    try {
                    
        c.setAtivo(false);            
        dados.remove(c);
        cd.alterar(c);
        
        if (dados.isEmpty())
            listaVazia = true;
        

        mensagem = "Carro excluido com sucesso!";
        FacesMessage message = new FacesMessage(mensagem);
        context.addMessage("listagemcarros", message);

    } catch (Exception exc) {
        mensagem = "Erro: " + exc.getMessage();
        FacesMessage message = new FacesMessage(mensagem);
        context.addMessage("listagemcarros", message);
    }


}

}[/code]

[code]package persistence;

import org.hibernate.;
import java.util.
;

import modelo.Carro;
import hibernate.HibernateUtil;

public class CarroDao {

Session s;    
Transaction t;
Query q;

public CarroDao() {
}

public void salvar(Carro u) throws Exception{
    
    
    s = HibernateUtil.getSessionFactory().openSession();
    t = s.beginTransaction();
    s.save(u);
    t.commit();   

}

public void alterar(Carro u) throws Exception{

    
    s = HibernateUtil.getSessionFactory().openSession();
    t = s.beginTransaction();
    s.update(u);
    t.commit();
    

    
}

public void apagar(Carro u) throws Exception{

    s = HibernateUtil.getSessionFactory().openSession();
    t = s.beginTransaction();
    s.delete(u);
    t.commit();       

}

public Carro listarUm(Integer id) throws Exception{

    s = HibernateUtil.getSessionFactory().openSession();
    q = s.createQuery("from Carro where id = " + id);
    return (Carro) q.uniqueResult();

}

public List<Carro> listar() throws Exception{

    s = HibernateUtil.getSessionFactory().openSession();
    q = s.createQuery("from Carro");        
    return q.list();

}

public List<Carro> listarAtivo() throws Exception{        
    
    s = HibernateUtil.getSessionFactory().openSession();
    q = s.createQuery("from Carro where ativo = true");
    return q.list();
    
}  

}
[/code]

Sera que alguem pode me ajudar?

:cry:

Verifique seu método Cadastrar()

public void cadastrar() {

        FacesContext context = FacesContext.getCurrentInstance();
        String mensagem = "";

        try {
            carro.setAtivo(true);
            cd.salvar(carro);            
            dados.add(carro);
            carro = new Carro();
            listaVazia = false;

            mensagem = "Carro cadastrado com sucesso!";
            FacesMessage message = new FacesMessage(mensagem);
            context.addMessage("formulario", message);

        } catch (Exception exp) {

            mensagem = "Erro: " + exp.getMessage();
            FacesMessage message = new FacesMessage(mensagem);
            context.addMessage("formulario", message);

        }

    }
            carro.setAtivo(true);
            cd.salvar(carro);            
            dados.add(carro);
            carro = new Carro();
            listaVazia = false;

Why? Oque está fazendo ali?

Ferreira,

Mostre-nos sua classe Carro e seus mapeamentos, principalmente os mapeamentos das coleções que a entidade Carro possui.

@braços

Ps.: Não sou eu que estou com erros :wink:

É o camarada que criou o tópico… valeu

[quote=TheKill]Ps.: Não sou eu que estou com erros :wink:

É o camarada que criou o tópico… valeu[/quote]

Sim… Desculpe… olhei o post errado ao responder a mensagem.

@braços

Desculpem a demora.

package modelo;

import java.util.List;
import javax.persistence.*;

@Entity
@Table(name="carro")
public class Carro {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "cod")
    private String id;

    @Column(name="placa", length=7, nullable=false, unique=true)
    private String placa;

    @Column(name="marca", length=30, nullable=false)
    private String marca;

    @Column(name="modelo", length=30, nullable=false)
    private String modelo;

    @Column(name="anofabric", length=4, nullable=false)
    private String anoFabric;

    @Column(name="anomodelo", length=4, nullable=false)
    private String anoModelo;

    @Column(name="chassi", length=17, nullable=false)
    private String chassi;

    @Column(name="renavan", length=15, nullable=false)
    private String renavan;

    @Column(name="ativo")
    private boolean ativo;

    @OneToMany(mappedBy="carroItinerario")
    private List<Itinerario> itinerarios;

    @OneToMany(mappedBy="carroItemNota")
    private List<ItemNota> itensNota;

    public Carro() {
        
    }

    public String getAnoFabric() {
        return anoFabric;
    }

    public void setAnoFabric(String anoFabric) {
        this.anoFabric = anoFabric;
    }

    public String getAnoModelo() {
        return anoModelo;
    }

    public void setAnoModelo(String anoModelo) {
        this.anoModelo = anoModelo;
    }

    public String getChassi() {
        return chassi;
    }

    public void setChassi(String chassi) {
        this.chassi = chassi;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public List<ItemNota> getItensNota() {
       return itensNota;
    }

    public void setItensNota(List<ItemNota> itensNota) {
        this.itensNota = itensNota;
    }

    public List<Itinerario> getItinerarios() {
        return itinerarios;
    }

    public void setItinerarios(List<Itinerario> itinerarios) {
        this.itinerarios = itinerarios;
    }

    public String getMarca() {
        return marca;
    }

    public void setMarca(String marca) {
        this.marca = marca;
    }

    public String getModelo() {
        return modelo;
    }

    public void setModelo(String modelo) {
        this.modelo = modelo;
    }

    public String getPlaca() {
        return placa;
    }

    public void setPlaca(String placa) {
        this.placa = placa;
    }

    public String getRenavan() {
        return renavan;
    }

    public void setRenavan(String renavan) {
        this.renavan = renavan;
    }

    public boolean isAtivo() {
        return ativo;
    }

    public void setAtivo(boolean ativo) {
        this.ativo = ativo;
    }

    
}

Ferreira.Andre,

Seguinte… Pelo que percebi vc carrega os carros ativos numa lista para exibir para o usuário e vc seleciona um destes itens para remoção. Inclusive o seu método excluir ao invés de excluir vc na verdade está alterando.

Enfim, dê uma conferida se esse método openSession() cria direto uma sessão sem verificar se já tem uma aberta. Se ele abrir outra sessão o que ocorre é que vc está neste caso com duas sessões abertas e tentando salvar um objeto de uma sessão na outra.

Experimente criar um método openSession nesse HibernateUtil que verifica se existe alguma sessão aberta e se caso existir pega a atual, de maneira a não criar uma nova sessão.

Algo assim:


public Session openSession() {
    Session session = null;
    if(sessionFactory.getCurrentSession() == null) {
        session = sessionFactory.openSession();
    }
    return session;
}

@braços

Obrigado, mais do jeito que me enviou não funcionou, countudo me deu ideia do que estava acontecendo e consegui resolver assim:


package persistence;

import org.hibernate.*;
import java.util.*;
import modelo.Carro;
import hibernate.HibernateUtil;


public class CarroDao {

    Session s;    
    Transaction t;
    Query q;

    public CarroDao() {
        s = HibernateUtil.getSessionFactory().openSession();
    }

    public void salvar(Carro u) throws Exception{      
        
        t = s.beginTransaction();
        s.save(u);
        t.commit();   
        
    }

    public void alterar(Carro u) throws Exception{        
        
        t = s.beginTransaction();
        s.update(u);
        t.commit();
        
    }

    public void apagar(Carro u) throws Exception{
        
        t = s.beginTransaction();
        s.delete(u);
        t.commit();       

    }

    public Carro listarUm(Integer id) throws Exception{

        s = HibernateUtil.getSessionFactory().openSession();
        q = s.createQuery("from Carro where id = " + id);
        return (Carro) q.uniqueResult();

    }

    public List<Carro> listar() throws Exception{

        s = HibernateUtil.getSessionFactory().openSession();
        q = s.createQuery("from Carro");        
        return q.list();

    }

    public List<Carro> listarAtivo() throws Exception{        
        
        s = HibernateUtil.getSessionFactory().openSession();
        q = s.createQuery("from Carro where ativo = true");
        return q.list();
        
    }
    
}

Abraços

:smiley:

Desculpem enviei errado.

segue o correto:


package persistence;

import org.hibernate.*;
import java.util.*;
import modelo.Carro;
import hibernate.HibernateUtil;


public class CarroDao {

    Session s;    
    Transaction t;
    Query q;

    public CarroDao() {
        s = HibernateUtil.getSessionFactory().openSession();
    }

    public void salvar(Carro u) throws Exception{      
        
        t = s.beginTransaction();
        s.save(u);
        t.commit();   
        
    }

    public void alterar(Carro u) throws Exception{        
        
        t = s.beginTransaction();
        s.update(u);
        t.commit();
        
    }

    public void apagar(Carro u) throws Exception{
        
        t = s.beginTransaction();
        s.delete(u);
        t.commit();       

    }

    public Carro listarUm(Integer id) throws Exception{

        q = s.createQuery("from Carro where id = " + id);
        return (Carro) q.uniqueResult();

    }

    public List<Carro> listar() throws Exception{

        q = s.createQuery("from Carro");        
        return q.list();

    }

    public List<Carro> listarAtivo() throws Exception{        
        
        q = s.createQuery("from Carro where ativo = true");
        return q.list();
        
    }
    
}

Abraços

Ferreira.Andre,

O código que te passei não tinha a intenção de funcionar mesmo… mas era para exemplificar o que te falei anteriormente.

Veja que da maneira que vc está fazendo agora, não está abrindo uma nova sessão toda vez, mas usando a mesma aberta anteriormente. Você pode usar o método getCurrentSession() para recuperar a sessão atual.

PS.: Se conseguiu resolver edite seu primeiro post e marque como [RESOLVIDO]

@braços