Bom já procurei no google, guj e outro. mas sei lá n consegui resolver… ta foda. ja mudei a implementação dos meus metodos pq vi q poderia ser o bi-direcional das Classes… mas nada da certo…
Alguem pode me dar uma Luz quanto a esse erro???
org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
Provavelmente seu problema começou a partir do momento que você abriu duas sessões por acidente (s1 e s2, por exemplo).
Aí você deve estar tentando atualizar uma instância gerenciada por s1 usando s2.
colored
Então eu tenho noção disso… mas tipo meu problema ocorre… q eu faço select d uma lista… e dps vo tentar excluir um item dessa lista…
mas no select n abre sessão… n sei pq tem esse problema…
tnaires
Acho que será melhor você mostrar um pouco de código.
colored
Metodo que estou excluindo 1 Item…
publicvoidexcluirPropostaItem(){
Map<String,Object>parametros=newHashMap<String,Object>();parametros.put("id",propostaItemAuxiliar.getId());List<Dependente>listaDependentes=daoDependente.listaPorCriterio("from Dependente d where d.propostaItem.id = :id ",parametros);for(Dependentedp:listaDependentes){
daoDependente.apagar(dp);}
listaItemProposta.remove(propostaItemAuxiliar);daoPropostaItem.apagar(propostaItemAuxiliar);}
GenericDAO
publicclassGenericDAO<T>extendsHibernateUtilimplementsInterfaceDAO<T,Serializable>{/* Classe e Session utilizada nos metodos */privatefinalClass<T>classe;privateSessionsession;publicGenericDAO(Class<T>classe){this.classe=classe;session=HibernateUtil.getCurrentSession();}/* Retorna um Objeto, de acordo com ID passado por parâmetro. */publicTprocurarPorId(Serializableid){return(T)session.load(classe,id);}/* Apaga um Objeto, de acordo com objeto passado por parâmetro. */publicvoidapagar(Tentidade){try{doBeginTransaction();getCurrentSession().delete(entidade);doCommit();}catch(Exceptione){doRollback();e.printStackTrace();}}/* Lista todos objetos de uma Entidade */publicList<T>listar(){Criteriac=session.createCriteria(classe);returnc.list();}/* Retorna uma Lista de Objetos, Passa-se por Parametro uma Query, e os parâmetros por um Map. */publicList<T>listaPorCriterio(Stringquery,Map<String,Object>parametros){Queryq=session.createQuery(query);for(Stringchave:parametros.keySet()){q.setParameter(chave,parametros.get(chave));}returnq.list();}}
colored
E Minha Classe Hibernate Util…
publicclassHibernateUtil{/** * Protegido para evitar a criação da classe */protectedHibernateUtil(){super();}/* Constante de caminho do arquivo de configuração do Hibernate *//* Threads que controlarão a sessão e a transação */privatestaticfinalThreadLocal<Session>threadSession=newThreadLocal<Session>();privatestaticfinalThreadLocal<Transaction>threadTransaction=newThreadLocal<Transaction>();/* Variaveis do Hibernate */privatestaticfinalConfigurationcfg=newAnnotationConfiguration();privatestaticSessionFactorysessionFactory;/* Variavel log4J */privatestaticLoggerlog=Logger.getLogger(HibernateUtil.class);/** Método que retorna a instancia da Sessão. */publicstaticSessiongetCurrentSession()throwsHibernateException{Sessionsession=threadSession.get();try{if(session==null||!session.isOpen()){if(sessionFactory==null){try{cfg.configure();sessionFactory=cfg.buildSessionFactory();}catch(Exceptione){throwe;}}session=(sessionFactory!=null)?sessionFactory.openSession():null;threadSession.set(session);}}catch(Exceptione){thrownewHibernateException(e);}log.info("Sessão Retornada");returnsession;}/** * Método que fecha a sessão do Hibernate. * @throws SessionFactoryException */publicstaticvoiddoCloseSession()throwsHibernateException{Sessionsession=threadSession.get();threadSession.set(null);try{if(session!=null){session.close();log.info("Sessão Fechada");}}catch(Exceptione){thrownewHibernateException(e);}}/** * Método que inicia a transação do Hibernate. * @throws SessionFactoryException */publicstaticvoiddoBeginTransaction()throwsHibernateException{Transactiontx=threadTransaction.get();try{if(tx==null){tx=getCurrentSession().beginTransaction();threadTransaction.set(tx);log.info("Sessão Pronta para Transação");}}catch(Exceptione){thrownewHibernateException(e);}}/** * Método que executa o rollback da transação. * @throws SessionFactoryException */publicstaticvoiddoRollback()throwsHibernateException{Transactiontx=threadTransaction.get();try{if(tx!=null&&!tx.wasCommitted()&&!tx.wasRolledBack()){tx.rollback();threadTransaction.set(null);log.info("Rollback Efetuado");}}catch(Exceptione){thrownewHibernateException(e);}}/* LIMPANDO CACHE PRIMÁRIO DO HIBERNATE */publicstaticvoiddoFlush(){try{getCurrentSession().flush();getCurrentSession().clear();log.info("Cache Limpo");}catch(Exceptione){thrownewHibernateException(e);}}/** * Método que commita a transação. * @throws SessionFactoryException */publicstaticvoiddoCommit()throwsHibernateException{Transactiontx=threadTransaction.get();try{if(tx!=null&&!tx.wasCommitted()&&!tx.wasRolledBack()){tx.commit();threadTransaction.set(null);log.info("Commit Efetuado");doFlush();}}catch(Exceptione){doRollback();thrownewHibernateException(e);}}}
Acho q com isso da pra ter uma ideia das melecas que deve ter aki no projeto kkkk
tnaires
Bom, eu estou vendo que você abre a sessão mas não a fecha. Você precisa fechar a sessão após cada operação.
colored
Sim… eu sei… mas tipo eu colokei o metodo doCloseSession. após o commit mas ai ele da erro falando q ta fechada a sessão