Two sessions no hibernate

Bom dia pessoal!
To ficando louco já pra tentar descobrir o porque do erro “two sessions” do hibernate. Procurei ontem a tarde toda, e hoje a manhã toda, e ainda não desisti.
Venho pedir a ajuda de vocês, se vocês sabem me informar os tipo de causas que pode dar esse erro, para eu analisar meu código e tentar corrigir isso.

Caso alguém esteja disposto a dar uma olhada nos códigos para tentar identificar, só pedir o código que eu posto aqui.

Coisas que já tentei:

  • Fechar todas sessões após fazer minha requisição. Resultado: Funcionou, porém o LAZY não funciona, então não solucionou meu problema.
  • Mudar de openSession(), para getCurrentSession(). Resultado: Criteria não funcionou. (Não sei se eu precisava fazer algo adicional)

Estou sem saber o que fazer :frowning:

Obrigado desde já!

O erro é:

SEVERE: org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions at org.hibernate.collection.AbstractPersistentCollection.setCurrentSession(AbstractPersistentCollection.java:410) at org.hibernate.event.def.OnUpdateVisitor.processCollection(OnUpdateVisitor.java:43) at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:101) at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:61) at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:55) at org.hibernate.event.def.AbstractVisitor.process(AbstractVisitor.java:123) at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:101) at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:52) at org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:766) at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:744) at br.com.zanzini.dao.ClienteDao.excluir(ClienteDao.java:45) at br.com.zanzini.bean.DeletarClienteBean.deletarCliente(DeletarClienteBean.java:52) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at com.sun.el.parser.AstValue.invoke(AstValue.java:254) at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:302) at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) at javax.faces.component.UICommand.broadcast(UICommand.java:315) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) 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:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) at com.sun.grizzly.ContextTask.run(ContextTask.java:71) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at java.lang.Thread.run(Thread.java:722)

Olha o meu código onde executa os dao, e vejam se eu posso construir os dao dessa forma:

(clienteDao e vendedorDao)

[code]ClienteDao clienteDao = new ClienteDao();
cliente = clienteDao.getClienteById(getPes_id());

        VendedorDao vendedorDao = new VendedorDao();
        vendedor = vendedorDao.getVendedorByCod(vendedorLogin.getCodigo());

        if (cliente.getVen_id().getPes_id() != vendedor.getPes_id()) {
            System.out.println("Erro");
        } else {
            System.out.println("Cliente deletado");
            try{
                clienteDao.excluir(cliente);
            }catch(Exception e){
                e.printStackTrace();
            }
        }[/code]

As consultas são todas feitas corretamente, a exception dá no clienteDao.excluir(cliente)

Aqui mostra 4 soluções para resolver o problema do Lazy: Quatro soluções para LazyInitializationException

Em algum lugar você está abrindo a transação duas vezes.

Acho que o erro nao esta neste trecho que voce nos mostrou, deve estar em uma das classes DAO ou em ambas

Como voce instancia sua session ? usa o HibernateUtil ?

[quote]Acho que o erro nao esta neste trecho que voce nos mostrou, deve estar em uma das classes DAO ou em ambas

Como voce instancia sua session ? usa o HibernateUtil ?
[/quote]

Uso HibernateUtil sim…

[code]public class HibernateUtil {
private static SessionFactory sessionFactory;
static {
try {
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println(“Initial SessionFactory creation failed.” + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
if (sessionFactory == null) {
try {
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println(“Initial SessionFactory creation failed.” + ex);
throw new ExceptionInInitializerError(ex);
}

    }
    return sessionFactory;
}
public static Session getSession() {
    return sessionFactory
            .getCurrentSession();
}
public static Session openSession() {
    return sessionFactory
            .openSession();
}

}[/code]

E os meus 2 dao:

public class VendedorDao { Vendedor vendedor; public VendedorDao() { } public void incluir(Vendedor e) { Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); session.saveOrUpdate(e); tx.commit(); } public void atualizar(Vendedor e) { Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); session.saveOrUpdate(e); tx.commit(); } public void excluir(Vendedor e) { Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); session.delete(e); tx.commit(); } public Vendedor getVendedorById(long id) { Session session = HibernateUtil.getSession(); return (Vendedor) session.get(Vendedor.class, id); } public Vendedor getVendedorByCod(long codigo){ Session session = HibernateUtil.openSession(); return (Vendedor) session.createCriteria(Vendedor.class) .add(Restrictions.eq("ven_codigo", codigo)) .uniqueResult(); } }

[code]public class ClienteDao {
Cliente cliente;
public ClienteDao() {
}
public void incluir(Cliente e) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
session.saveOrUpdate(e);
tx.commit();
}

public void atualizar(Cliente e) {
    Session session = HibernateUtil.getSession();
    Transaction tx = session.beginTransaction();
    session.saveOrUpdate(e);
    tx.commit();
}
public void excluir(Cliente e) {
    Session session = HibernateUtil.getSession();
    Transaction tx = session.beginTransaction();
    session.delete(e);
    tx.commit();
}
public Cliente getClienteById(long pes_id) {
    Session session = HibernateUtil.openSession();
    return (Cliente) session.get(Cliente.class, pes_id);
}
public List<Cliente> getClienteByVendedor(Vendedor vendedor) {
    Session session = HibernateUtil.openSession();
    return session.createCriteria(Cliente.class)
                .add(Restrictions.eq("ven_id", vendedor))
                .list();
}

}[/code]

public class HibernateUtil {  
    private static SessionFactory sessionFactory;  
    static {  
        try {  
            sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();  
        } catch (Throwable ex) {  
            System.err.println("Initial SessionFactory creation failed." + ex);  
            throw new ExceptionInInitializerError(ex);  
        }  
    }  
    public static SessionFactory getSessionFactory() {  
        if (sessionFactory == null) {  
            try {  
                sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();  
            } catch (Throwable ex) {  
                System.err.println("Initial SessionFactory creation failed." + ex);  
                throw new ExceptionInInitializerError(ex);  
            }  
  
        }  
        return sessionFactory;  
    }  
    public static Session getSession() {  
        return sessionFactory  
                .getCurrentSession();  
    }  
    public static Session openSession() {  
        return sessionFactory  
                .openSession();  
    }  
}  

Ao meu ver, esta ai o erro, faça assim, APAGUE o metodo public static SessionFactory getSessionFactory() e o openSession. Pode apagar ele todinho mesmo, deixe so assim:

public class HibernateUtil {  
    private static SessionFactory sessionFactory;  
    static {  
        try {  
            sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();  
        } catch (Throwable ex) {  
            System.err.println("Initial SessionFactory creation failed." + ex);  
            throw new ExceptionInInitializerError(ex);  
        }  
    }  
    
    public static Session getSession() {  
        return sessionFactory  
                .getCurrentSession();  
    }  

}

e la na suas DAOs que voce fecha a session, exemplo:

public void incluir(Vendedor e) {  
        Session session = HibernateUtil.getSession();  
        Transaction tx = session.beginTransaction();  
        session.saveOrUpdate(e);  
        tx.commit();  
        session.close();
    }  

[quote=rof20004][code]
public class HibernateUtil {
private static SessionFactory sessionFactory;
static {
try {
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println(“Initial SessionFactory creation failed.” + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
if (sessionFactory == null) {
try {
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println(“Initial SessionFactory creation failed.” + ex);
throw new ExceptionInInitializerError(ex);
}

    }  
    return sessionFactory;  
}  
public static Session getSession() {  
    return sessionFactory  
            .getCurrentSession();  
}  
public static Session openSession() {  
    return sessionFactory  
            .openSession();  
}  

}
[/code]

Ao meu ver, esta ai o erro, faça assim, APAGUE o metodo public static SessionFactory getSessionFactory() e o openSession. Pode apagar ele todinho mesmo, deixe so assim:

public class HibernateUtil {  
    private static SessionFactory sessionFactory;  
    static {  
        try {  
            sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();  
        } catch (Throwable ex) {  
            System.err.println("Initial SessionFactory creation failed." + ex);  
            throw new ExceptionInInitializerError(ex);  
        }  
    }  
    
    public static Session getSession() {  
        return sessionFactory  
                .getCurrentSession();  
    }  

}

e la na suas DAOs que voce fecha a session, exemplo:

public void incluir(Vendedor e) { Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); session.saveOrUpdate(e); tx.commit(); session.close(); } [/quote]

Entãão, dessa forma aí eu tentei e deu exatamente certo.
O problema nisso, é que meus LAZY não vai funcionar… E tenho algumas entidades que é necessário LAZY para minha aplicação! :frowning:

Entao agora com o bixo funcionando, voce segue a dica do Herbert

ta la em cima o link

[quote=rof20004]Entao agora com o bixo funcionando, voce segue a dica do Herbert

ta la em cima o link[/quote]

Se fechar a sessão, nao funciona nem das 4 soluções do link do cara…
2 soluções que ele propôs lá, nao serve na minha aplicacao, e as outras duas nao funciona fechando a sessão!

Posso fazer isso?

ClienteDao clienteDao = new ClienteDao(); cliente = clienteDao.getClienteById(1); clienteDao.excluir(cliente);
O problema está dando no segundo Dao…

"Illegal attempt to associate a collection with two open sessions"

O dao é assim:

public void excluir(Cliente e) { Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); session.delete(e); tx.commit(); } public Cliente getClienteById(long pes_id) { Session session = HibernateUtil.openSession(); return (Cliente) session.get(Cliente.class, pes_id); }

E o hibernateUtil tá ai pra cima…

Se eu fechar a sessão terei problemas com LAZY…

O que posso fazer será?