Tenho uma aplicação que utilizando o Hibernate. Tenho meu HibernateUtil.
publicclassHibernateUtil{privatestaticfinalSessionFactorysessionFactory;static{try{sessionFactory=newAnnotationConfiguration().configure().buildSessionFactory();}catch(Throwableex){System.err.println("Não foi possivel criar a SessionFactory."+ex);thrownewExceptionInInitializerError(ex);}}publicstaticSessiongetSession(){returnsessionFactory.openSession();}}
Estou todo enrolado para aprender a gerenciar essa sessão. Sempre que tento um session.close (O que acho que deveria ser feito) ele dá erro que a sessão já foi fechada e não pode mais ser utiliza. Creio que isso ocorre pelo motivo que getSession ser static.
Mas minha pergunta é qual a melhor maneira de se gerenciar as sessoes que utilizo para realizar operações no banco de dados?
Agora eu queria saber mais da teoria disso tudo. Só pelo que você fez no metodo save dá para garantir a transação disso tudo.
E
edysnipes
Bom gente estou tentando modificar meu sistema para gerenciar as sessões do Hibernate. Começando por tentar fechar as sessões utilizadas para operações com o banco de dados.
Aí entrei nos assuntos: session.load, session.get e detached.
Ao fazer uma consulta no banco de dados e recuperar com session.load um usuario tentei fechar a sessao e recebi um: Lazy Initialization Exception.
Descobri o porque sendo que meu usuário tem relacionamento com outros objetos tipo perfil, situacao, etc e o load trabalha com um Prozy e como a sessão foi fechado lançou a excessão.
Blz, entendi. (Se for isso mesmo)
Agora eu pergunto como fechar minha sessão nesse caso? Tentei o session.get mas a mesma excessão é lançada.
Agradeço aos que puderem ajudar.
Abraço!
A
arthurminarini
vc vai ter que ter um filtro para gerenciar isso
em seus metodo vc pega a session mas nunca precisa mais fechar é só usar esse filtro
Blz! Mas como utilizo isso nas minhas DAOs? Como ficaria um exemplo da utilização do filtro nas DAOs?
Obrigado.
Se puder indicar uns links sobre a teoria disso tudo? Isso é um padrão?
Vlw!
H
hiroshisilva
tambem estou com a mesma duvida mais nesse caso de colocar um filtro quando eu abrir a session dentro do dao não vai ser o mesmo objeto então não fecharia uma session diferente da que eu uso no DAO?
Obrigado!
A
arthurminarini
não! vc teria que ter um HibernateUtil trabalando com sessionfactory e os daos extends a ele ou um dao generico e os demais daos extends ao dao generico quando à fechar a session diferente isso é tem que ser tratado na propria classe de pegar a session.
No site do hibernate tem o exemplo deste filtro de forma até mais complicada e mais tratada e tabém trabalhar com um HibernateUtil e Dao generico
E
edysnipes
Arthur eu trabalho com o HibernateUtil:
publicclassHibernateUtil{privatestaticfinalSessionFactorysessionFactory;static{try{sessionFactory=newAnnotationConfiguration().configure().buildSessionFactory();}catch(Throwableex){System.err.println("Não foi possivel criar a SessionFactory."+ex);thrownewExceptionInInitializerError(ex);}}publicstaticSessiongetSession(){returnsessionFactory.openSession();}}
Os dados de conexão, como você sabe, estão no hibernate.cfg.xml.
Aí eu tenho a DAOGenerica. Um exemplo do método save:
publicclassSolicitanteDAO{privatestaticSessionsessao;publicstaticbooleanincluir(Solicitantesolicitante){if(sessao==null){sessao=HibernateUtil.getSessionFactory().openSession();}if(sessao!=null){try{//criptografa a senhatry{MessageDigestmd5=MessageDigest.getInstance("MD5");BigIntegersenhaCriptografada=newBigInteger(1,md5.digest(solicitante.getSenha().getBytes()));solicitante.setSenha(senhaCriptografada.toString(16));}catch(NoSuchAlgorithmExceptione){e.printStackTrace();}//atribuir datasessao.beginTransaction();sessao.save(solicitante);sessao.getTransaction().commit();sessao.flush();sessao.clear();returntrue;}catch(Exceptione){sessao.getTransaction().rollback();returnfalse;}}returnfalse;}
Pelo que eu entendi, uma vez aberta uma sessão, ela será utilizada (naquele DAO) até o final do uso do sistema. O desempenho ficou muito bom, mas existe algum problema em fazer isso?
H
hiroshisilva
cara eu criei um dao generico usando generics
depois criei um DaoFactory que faz o controle de sessao que usa o hibernate util