Que erro é esse no Hibernate quando tento salvar alteração?

Tenho uma classe usuario quanto tento salvar as alterações nele da erro, faço isto para salvar

HibernateUtilMySql.getSession().beginTransaction();
HibernateUtilMySql.getSession().update(user);
HibernateUtilMySql.getSession().getTransaction().commit();[/code]

e gerar este erro:
[code]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:40)
	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:267)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:216)
	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:588)
	at org.hibernate.impl.SessionImpl.update(SessionImpl.java:576)
	at org.hibernate.impl.SessionImpl.update(SessionImpl.java:568)
	at br.com.maringa.compGerusa.hibernate.genericoDAO.DAO.update(DAO.java:21)
	at br.com.maringa.gvap.usuario.action.Usuario.execute(Usuario.java:39)
	at com.opensymphony.xwork.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:283)
	at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:166)
	at com.opensymphony.xwork.interceptor.TimerInterceptor.intercept(TimerInterceptor.java:63)
	at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
	at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
	at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
	at com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor.intercept(DefaultWorkflowInterceptor.java:55)
	at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
	at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
	at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
	at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
	at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
	at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
	at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
	at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
	at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
	at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
	at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
	at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
	at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
	at br.com.maringa.gvap.system.ApplicationSecurityInterceptor.intercept(ApplicationSecurityInterceptor.java:51)
	at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
	at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
	at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
	at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
	at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
	at com.opensymphony.xwork.DefaultActionProxy.execute(DefaultActionProxy.java:116)
	at com.opensymphony.webwork.dispatcher.ServletDispatcher.serviceAction(ServletDispatcher.java:272)
	at com.opensymphony.webwork.dispatcher.ServletDispatcher.service(ServletDispatcher.java:237)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at com.opensymphony.webwork.lifecycle.RequestLifecycleFilter.doFilter(RequestLifecycleFilter.java:67)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118)
	at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
	at java.lang.Thread.run(Unknown Source)

o que será isto?

Coloca o codigo da classe HibernateUtilMySql pro pessoal dar uma olhada

basicamente ocorre quando vc abre uma session e tenta salvar uma colecao em outra session… provavelmente o seu getSession() esta devolvendo Session’s diferente para cada chamada…
normalmente, vc deve fazer com que a Session seja “thread bound”… se eu nao me engano, no proprio manual do hibernate fala para se fazer um HibernateUtil e pegar a sessao somente de lah…

[edit]
err… deixa eu completar…
vc deve associar a session aberta em um ThreadLocal (e isso, se eu nao me engano, esta na documentacao do hibernate)…
[/edit]

meu HibernateUtilMySql [code]
public class HibernateUtilMySql {

 //*************************************************************************
public static final SessionFactory sessionFactory;

static {
    try {
        // Create the SessionFactory from hibernate.cfg.xml
        sessionFactory = new Configuration().configure("hibernateMySqlGerusa.cfg.xml").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 final ThreadLocal session = new ThreadLocal();

public static Session getSession() throws HibernateException {
    Session s = (Session) session.get();
    // Open a new Session, if this thread has none yet
    if (s == null) {
        s = sessionFactory.openSession();
        // Store it in the ThreadLocal variable
        session.set(s);
    }
    return s;
}

public static void closeSession() throws HibernateException {
    Session s = (Session) session.get();
    if (s != null){
    	s.close();
    }
    session.set(null);
}

}
[/code]

e a classe DAO

public class DAO implements HibernateGenericoDao {

	 
	public Serializable save(Object obj) {
		//flush();
		return HibernateUtilMySql.getSession().save(obj);
	}

	public void update(Object obj) {
		//flush();
		HibernateUtilMySql.getSession().update(obj);
	}

	public void delete(Object obj) {
		//flush();
		HibernateUtilMySql.getSession().delete(obj);
	}

	public List list(Class clazz) {
		//flush();
		return HibernateUtilMySql.getSession().createCriteria(clazz).list();
	}

	public List list(Class clazz, int firstResult, int maxResult) {
		//Paginação
		//flush();
		Criteria criteria = HibernateUtilMySql.getSession().createCriteria(clazz);
				
		criteria.setFirstResult(firstResult);
		criteria.setMaxResults(maxResult);
		
		return criteria.list();
	}

	public List listByExample(Object example) {
		//flush();
		Criteria criteria = HibernateUtilMySql.getSession().createCriteria(example.getClass());

		Example sample = Example.create( example );
		sample.enableLike();
		sample.excludeZeroes();

		criteria.add( sample );

		return criteria.list();
	}

	public Object getById(Serializable id, Class clazz) {
		//flush();
		return HibernateUtilMySql.getSession().get(clazz, id);
	}

	public List listNamedQuery(String namedQuery) {
		//flush();
		return HibernateUtilMySql.getSession().getNamedQuery(namedQuery).list();
	}

	public Query queryNamedQuery(String namedQuery) {
		//flush();
		return HibernateUtilMySql.getSession().getNamedQuery(namedQuery);
	}
	
	private void flush(){
		HibernateUtilMySql.getSession().flush();
	}

	public void beginTransaction() {
		HibernateUtilMySql.getSession().beginTransaction();
	}

	public void commitTransaction() {
		HibernateUtilMySql.getSession().getTransaction().commit();
	}

	public void rollbackTransaction() {
		HibernateUtilMySql.getSession().getTransaction().rollback();
	}
		
}

Niguem sabe que erro é esse Illegal attempt to associate a collection with two open sessions até agora não consegui resolver.

Você carregou uma collection lazy em uma session e tentou usá-la em outra.

Collection col = ((ClasseX)session1.load(ClasseX.class, 10)).getCollection();
ClasseX xx = new ClasseX();
xx.setCollection(col);
session2.save(xx);

Sim, quando o usuario loga no sistema eu puxo uma coleção de menus e permissão e coloco o usuario na sessao, tenho uma tela onde o usuario pode mudar seus dados, quando abre a tela pego o usuario da sessao mostro os dados dele e deixo o usuario altera-lo, mas quando o usuario tenta salvar as alterações da esse erro.

basicamente ocorre quando vc abre uma session e tenta salvar uma colecao em outra session

antes de alterar, carregue novamente do banco de dados, altere o que o usuario pediu e salve com a mesma sessao em que foi carregado

desse jeito funcionou, então toda vez que for grava um objto que já esta na sessão eu busco ele no banco, aplico as alterações nele salvo ele no bd e substituo o obj antigo na sessão.

ou entao vc mantem a sessao pelo escopo necessario (no caso, a http session) e usa a mesma sessao para salvar