Bom durante um tempo eu venho utilizando as minhas classes desta forma, mas dps de ver a apostila da caelum,
eu fikei meio na duvida se eh uma das formas corretas de se trabalhar ou não…
HibernateUtil
publicclassHibernateUtil{privatestaticLoggerlog=Logger.getLogger(HibernateUtil.class);privatestaticSessionFactoryfactory;static{AnnotationConfigurationcfg=newAnnotationConfiguration();cfg.configure();factory=cfg.buildSessionFactory();}publicstaticSessiongetSession(){log.info("Opening New Session");Sessionsession=factory.openSession();session.beginTransaction();returnsession;}}
ai vc cria os metodos para dar session, transaction,commit,flush, rollback,close session!!
e nas suas clases vc so chama os metodos staticos , sem ter q abrir sempre a msm transacao e tals!!!
espero ter ajudado !!
flws
colored
Tipo eu n manjo nd de thread…
Mas o sistema varias pessoas vao ter q acessar…
PRa q akelas threads criadas?
Cherubini
tipo olha a classe inteira:
publicclassHibernateSessionFactory{/** * Construtor no-arg * Protegido para evitar a criação da classe */protectedHibernateSessionFactory(){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;/** * Método que retorna a instancia da Sessão. * @return Session * @throws SessionFactoryException */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);}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();}}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);}}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);}}catch(Exceptione){thrownewHibernateException(e);}}//LIMPANDO CACHE PRIMÁRIO DO HIBERNATE//UTILIZADO PARA OPERACOES EM BATCHpublicstaticvoiddoFlush(){try{getCurrentSession().flush();getCurrentSession().clear();}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);}}catch(Exceptione){doRollback();thrownewHibernateException(e);}}}
elas q vai controlar tudo para vc!!!E deixar o acesso bem estruturado!!
Resumindo use ThreadLocal quando quiser reaproveitar a Thread corrente, e não criar uma nova, pois ela é um mecanismo mais leve que a criação manual de uma Thread.
colored
kkk…
acho q eh mto avançado pra mim isso ai.
n entendi nd
Cherubini
huiehuiehiue!!!
q isso cara, pega com calma!!!
com a ThreadLocal eu tenho acesso seguro
para minhas sessions e transacoes!!Ela
vai gerenciar isso para vc!!!ao inves
de vc ficar na transacao toda hora abrindo
e fechando ou commitando ou dando rollback
é so chamar os metodos criados no seu HibernateUtil
que ele vai gerenciar isso para vc!!!
espero q ter ajudado!!Faz uns testes ai
que para você ver!!!
abraços flw
leonardofreitas8
Boa noite ...
Veja só a minha questão....
Tenho consultas variadas " por diversos parametros " que sempre me retornam um list, porem gostaria que no final do list tivesse um "Footer" com a somatória dos valores retornados da consulta, sendo assim criei uma variável chamada "somaEntrada" tipo BigDecimal e em seu GET coloquei meu método de soma (SUM) que atribui o valor da soma à variável...
Daí quando chamo no JSF value="#{meuBean.somaEntrada}" não retorna nenhuma soma quando os valores são listados... veja
Veja que para cada dao que eu abro coloco uma session, o begintransaction e o comit transaction e faco depois, antes e depois do método save por exempo do dao, está correto, veja abaixo:
or(Shelfs:shelves){if(daoCity.getCityBySymbol(s.getCity().getSymbol())==null){try{daoCity.getDaoGeneric().saveOrUpdate(s.getCity());}catch(DaoExceptionex){LogPersistence.logger.severe("Erroaoinseriracidade:" + s.getCity().getName() + "\n" + ex.getMessage()); } } HibernateCore.beginTransaction(); // Verifica se o elemento ja esta cadastrado no sistema, caso nao esteja cadastra no sistema if (daoShelf.getShelfByIp(s.getIp()) == null) { try { daoShelf.getDaoGeneric().save(s); } catch (DaoException ex) { LogPersistence.logger.severe("Erroaoinseriroelementocomip:" + s.getIp() + "(" + s.getName() + ")\n"+ex.getMessage());}newShelves.add(s);}HibernateCore.commitTransaction();}returnnewShelves;
Ou seja em cada classe que eu uso um dao eu faco isto, pegando a transacao do HibernateCore.