Illegal attempt to associate a collection with two open sessions

Boa tarde galera!

Sou iniciante em java web, e estou com um problema que ainda nao tinha me deparado, na tela de edição de um cliente, veja o erro que dá:
Com SESSION:

WARNING: #{alterarClienteBean.validarForm}: org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions javax.faces.FacesException: #{alterarClienteBean.validarForm}: org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118) 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) Caused by: javax.faces.el.EvaluationException: org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102) at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) ... 31 more Caused by: 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.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:293) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:223) at org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:33) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70) at org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:564) at org.hibernate.impl.SessionImpl.update(SessionImpl.java:552) at org.hibernate.impl.SessionImpl.update(SessionImpl.java:544) at br.com.zanzini.dao.ClienteDao.atualizar(ClienteDao.java:37) at br.com.zanzini.bean.AlterarClienteBean.validarForm(AlterarClienteBean.java:341) 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) ... 32 more

Meu HibernateUtil:

[code]package br.com.zanzini.dao;

import org.hibernate.;
import org.hibernate.cfg.
;

public class HibernateUtil {

private static SessionFactory sessionFactory;

static {
    try {

// Create the SessionFactory from hibernate.cfg.xml
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println(“Initial SessionFactory creation failed.” + ex);
throw new ExceptionInInitializerError(ex);
}
}

public static SessionFactory getSessionFactory() {
    if (sessionFactory == null) {
        try {

// Create the SessionFactory from hibernate.cfg.xml
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println(“Initial SessionFactory creation failed.” + ex);
throw new ExceptionInInitializerError(ex);
}

    }
    return sessionFactory;
}

}
[/code]

Parte do clienteDao que dá erro (session.update(e)):

public void atualizar(Cliente e) { Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); session.update(e); session.getTransaction().commit(); session.close(); }

Meu hibernate.cfg:

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

org.hibernate.dialect.MySQLDialect com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/vendas?autoReconnect=true root org.hibernate.context.ThreadLocalSessionContext
<mapping class="br.com.zanzini.entity.Estado"/>
<mapping class="br.com.zanzini.entity.Cidade"/>
<mapping class="br.com.zanzini.entity.Pessoa"/>
<mapping class="br.com.zanzini.entity.Telefone"/>
<mapping class="br.com.zanzini.entity.Vendedor"/>
<mapping class="br.com.zanzini.entity.Cliente"/>
[/code]

Alguém sabe como posso solucionar meu problema??
Obrigado desde já! Abraço!

A mensagem de erro diz que tem duas transações abertas.

Antes do método atualizar você não está abrindo uma transação não?

Utilize merge() ao invés de update()

Como visto no seu método:

public void atualizar(Cliente e) { Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); session.update(e); session.getTransaction().commit(); session.close(); }

Não sei exatamente o porque desse comportamento, descobri por acaso depois de muito quebrar a cabeça. Adianto que no MEU caso ocorreu APENAS quando utilizei update() onde havia relacionamentos do tipo ManyToOne com tabelas intermediárias resultantes de relacionamentos ManyToMany

https://forum.hibernate.org/viewtopic.php?f=1&t=1013361&sid=85ca18cd63f498c550ee3813949f257e

Quem tiver uma explicação, favor compartilhar.

[quote=Antonio Augusto]Adianto que ocorre quando se utiliza LAZY, onde tenha relacionamentos do tipo ManyToOne com tabelas intermediárias devido relacionamentos ManyToMany[/quote]Desculpe o modo como vou perguntar isso mas… hein?!

Nunca vi Lazy ser por causa de ManyToOne com relacionamento ManyToMany… Nunca mesmo. E eu tenho sistemas com esse cenário que não dão esse erro…

[quote=Hebert Coelho][quote=Antonio Augusto]Adianto que ocorre quando se utiliza LAZY, onde tenha relacionamentos do tipo ManyToOne com tabelas intermediárias devido relacionamentos ManyToMany[/quote]Desculpe o modo como vou perguntar isso mas… hein?!

Nunca vi Lazy ser por causa de ManyToOne com relacionamento ManyToMany… Nunca mesmo. E eu tenho sistemas com esse cenário que não dão esse erro…[/quote]

Atualizei meu comentário, veja se ficou do seu agrado, Hebert.

[quote=Antonio Augusto][quote=Hebert Coelho][quote=Antonio Augusto]Adianto que ocorre quando se utiliza LAZY, onde tenha relacionamentos do tipo ManyToOne com tabelas intermediárias devido relacionamentos ManyToMany[/quote]Desculpe o modo como vou perguntar isso mas… hein?!

Nunca vi Lazy ser por causa de ManyToOne com relacionamento ManyToMany… Nunca mesmo. E eu tenho sistemas com esse cenário que não dão esse erro…[/quote]

Atualizei meu comentário, veja se ficou do seu agrado, Hebert.[/quote]Uhum [=