Two sessions no hibernate

9 respostas
F

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)

9 Respostas

F

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

(clienteDao e vendedorDao)

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();
                }
            }

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

Hebert_Coelho

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.

R

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 ?

F
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 ?

Uso HibernateUtil sim...
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();
    }
}
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();
    }
}
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();
    }
}
R
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();
    }
F
rof20004:
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();
    }

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! :(

R

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

ta la em cima o link

F

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

ta la em cima o link

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!

F

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á?

Criado 22 de novembro de 2012
Ultima resposta 22 de nov. de 2012
Respostas 9
Participantes 3