| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2012 08:29:43
|
gmantovani2005
Debugger
Membro desde: 27/03/2008 13:12:51
Mensagens: 54
Localização: Maringá - PR / Brasil
Offline
|
Bom dia,
Hoje li um post antigo, mas que achei interessante sobre padrão de projeto DAO (http://www.rponte.com.br/tag/padraodeprojeto/).
Gostaria de saber como o pessoal está desenvolvendo aplicações JSF 2.0 com Hibernate, se estão ou não utilizando DAO ou se utilizam os próprios Beans (ou CDI) já fazendo direto a persistência dos dados?
Estou criando uma aplicação e realmente estou confuso, pois estou vendo uma camada a mais com pouco sentido, sendo que posso facilmente utilizar o Bean para fazer direto as persistências e regras de negócio.
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2012 09:52:39
|
valdirmf
What is classpath?
Membro desde: 26/01/2010 15:03:11
Mensagens: 8
Offline
|
Ola eu costumo fazer assim, e é claro voce pode melhorar criando DAO generico, as vantagens é que a visão não sabe quem faz a persistencia ou persistido não sabe que o persistiu ou seja voce pode mudar a camada de visualização: beans e xhtml, html, jsp, ou até mesmo mudar a camada de persistencia sem mexer nas outras classes.
É isso ai mas se aparecer ideia melhor é bem vindo para mim também
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2012 17:57:05
|
gmantovani2005
Debugger
Membro desde: 27/03/2008 13:12:51
Mensagens: 54
Localização: Maringá - PR / Brasil
Offline
|
Obrigado valdirmf pela resposta. Só para informação, eu já tenho um projeto com Hibernate todo com o Dao criado.
Só fiquei na dúvida pelo que li no Blog que referenciei anteriormente, me deixou pensando.
Tenho outra dúvida ainda referente ao JSF + Hibernate, que é onde iniciar e fechar a Session.
Como iniciei meu projeto agora, fiz um teste para ver se estaria tudo Ok com meu projeto do Hibernate adicionado como dependente do projeto JSF e se o trabalho iria ser feito corretamente ao mandar salvar.
Segui conforme código abaixo na minha classe ClienteBean:
Tentando explicar o que eu fiz, ao clicar no botão listar clientes o sistema irá trazer todos os clientes conforme método listaClientes().
Ao clicar em novo cliente estou criando um novo objeto Cliente e indo para página de cadastro.
Na página de cadastro, ao mandar salvar o cliente estou utilizando as classes Dao para este trabalho.
Funcionou, mas acredito não ser a melhor forma de fazer.
O motivo de achar isto é porque em todas as classes onde estou ou chamando dados do banco, ou salvando, eu gero uma nova sessão (Session).
A pergunta é:
Onde seria o melhor lugar para eu abrir e fechar minha sessão?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2012 19:09:54
|
Trebloc
JavaChild
![[Avatar]](/images/avatar/a6ac15a15c2dbbff1868a0ea531a9ccd.png)
Membro desde: 21/02/2010 03:46:13
Mensagens: 120
Localização: Brasília - DF
Offline
|
Existe um padrão chamando OpenSessionInView, que até é implementado por frameworks como o Spring, através de filtros.
Nele, você abre uma sessão a partir do momento que precisa acessar o banco e só a fecha após a view ter sido completamente renderizada. Ou seja, em um formulário de uma página web, ao clicar em um botão "Pesquisar" a sessão seria aberta, a pesquisa feita, os dados processados pelo seu bean e renderizados na view. Após tudo isso, a sessão é fechada. No caso de web, acho que esse padrão também pode ser chamado de OneSessionPerRequest (uma sessão por requisição).
O Spring faz isso, como falei, mas você também pode implementar seu próprio filtro pra fazer esse trabalho.
|
"In Javadoc we trust!"
Bacharel em Ciência da Computação
Oracle Certified Professional, Java SE 6 Programmer |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2012 19:26:42
|
valdirmf
What is classpath?
Membro desde: 26/01/2010 15:03:11
Mensagens: 8
Offline
|
Olha eu ainda sou um mero aprediz logo e estou pedalando também, mas segue a forma como eu faço para controlar as sessões
criei um filtro lembre que o filtro dever ser declarado no web.xml
o filter mapping, mapeia todas as requisições do tipo jsf
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2012 19:33:31
|
Trebloc
JavaChild
![[Avatar]](/images/avatar/a6ac15a15c2dbbff1868a0ea531a9ccd.png)
Membro desde: 21/02/2010 03:46:13
Mensagens: 120
Localização: Brasília - DF
Offline
|
valdirmf wrote:Olha eu ainda sou um mero aprediz logo e estou pedalando também, mas segue a forma como eu faço para controlar as sessões
criei um filtro lembre que o filtro dever ser declarado no web.xml
Só cuidado com esse catch(Throwable) ali. Tente sempre capturar as exceções que você sabe que podem acontecer dentro do try. Não se captura Exceptions genéricas e nem Throwables (e muito menos Errors).
|
"In Javadoc we trust!"
Bacharel em Ciência da Computação
Oracle Certified Professional, Java SE 6 Programmer |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2012 19:54:09
|
gmantovani2005
Debugger
Membro desde: 27/03/2008 13:12:51
Mensagens: 54
Localização: Maringá - PR / Brasil
Offline
|
valdirmf wrote:Olha eu ainda sou um mero aprediz logo e estou pedalando também, mas segue a forma como eu faço para controlar as sessões
criei um filtro lembre que o filtro dever ser declarado no web.xml
o filter mapping, mapeia todas as requisições do tipo jsf
Acho que entendi. Também dei uma lida em alguns posts no Guj e na Web para ajudar.
Encontrei isto:
http://www.guj.com.br/java/134876-duvida-sobre-o-metodo-open-session-in-view-do-hibernateresolvido
https://community.jboss.org/wiki/OpenSessionInView#A8
Eu estava abrindo a transação direto no Dao, então pelo que entendi isto está errado.
Eu posso fazer isto direto no filtro e me preoculpar no Dao apenas em salvar, alterar, excluir, entre outros como a regra de negócio.
Então o correto é usar isto nos filtros ?
Vcs tem alguma sugestão de material para entender o Spring e usar o OpenSessionInView?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2012 19:56:55
|
valdirmf
What is classpath?
Membro desde: 26/01/2010 15:03:11
Mensagens: 8
Offline
|
Só cuidado com esse catch(Throwable) ali. Tente sempre capturar as exceções que você sabe que podem acontecer dentro do try. Não se captura Exceptions genéricas e nem Throwables (e muito menos Errors).
Valeu pela informação, acredite ela é bem vinda, e agora que estou com um projeto sério, pois os outros eram didatico.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/02/2012 20:11:05
|
Trebloc
JavaChild
![[Avatar]](/images/avatar/a6ac15a15c2dbbff1868a0ea531a9ccd.png)
Membro desde: 21/02/2010 03:46:13
Mensagens: 120
Localização: Brasília - DF
Offline
|
gmantovani2005 wrote:
valdirmf wrote:Olha eu ainda sou um mero aprediz logo e estou pedalando também, mas segue a forma como eu faço para controlar as sessões
criei um filtro lembre que o filtro dever ser declarado no web.xml
o filter mapping, mapeia todas as requisições do tipo jsf
Acho que entendi. Também dei uma lida em alguns posts no Guj e na Web para ajudar.
Encontrei isto:
http://www.guj.com.br/java/134876-duvida-sobre-o-metodo-open-session-in-view-do-hibernateresolvido
https://community.jboss.org/wiki/OpenSessionInView#A8
Eu estava abrindo a transação direto no Dao, então pelo que entendi isto está errado.
Eu posso fazer isto direto no filtro e me preoculpar no Dao apenas em salvar, alterar, excluir, entre outros como a regra de negócio.
Então o correto é usar isto nos filtros ?
Vcs tem alguma sugestão de material para entender o Spring e usar o OpenSessionInView?
Sim, a ideia é que seus DAOs nem saibam onde as sessões são controladas. Eles simplesmente as usam (e esperam que haja um disponível).
Quanto ao OpenSessionInViewFilter do Spring, aqui no GUJ mesmo você encontra tópicos sobre:
http://www.guj.com.br/java/234060-opensessioninview-do-spring-resolvido
http://www.guj.com.br/java/225616-vraptor-3--hibernate--opensessioninviewfilterspring-lazyinitializationexceptionresolvido
Se entender bem inglês:
http://forum.springsource.org/showthread.php?25346-how-to-use-OpenSessionInViewFilter
Basicamente é adicionar o jar no classpath e usar o filtro (talvez você precise adicionar vários jars do Spring, como spring-core e spring-web).
Se tiver interesse em saber mais sobre o Spring, tem esse artigo aqui:
http://imasters.com.br/artigo/4497/java/spring_framework_introducao/
This message was edited 1 time. Last update was at 22/02/2012 20:21:51
|
"In Javadoc we trust!"
Bacharel em Ciência da Computação
Oracle Certified Professional, Java SE 6 Programmer |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/02/2012 19:30:46
|
gmantovani2005
Debugger
Membro desde: 27/03/2008 13:12:51
Mensagens: 54
Localização: Maringá - PR / Brasil
Offline
|
Olá pessoal,
Estou tentando fazer o exemplo do Open Session in View do Hibernate, mas quando mando listar os registros de cliente, está apresentando erro.
Estou achando que possa ser a configuração, mas antes de mudar gostaria de saber se deveria funcionar da forma que está.
HibernateUtil
ClienteDao
O Código de Erro é :
javax.servlet.ServletException: org.hibernate.HibernateException: No CurrentSessionContext configured!
javax.faces.webapp.FacesServlet.service(FacesServlet.java:321)
root cause
javax.faces.el.EvaluationException: org.hibernate.HibernateException: No CurrentSessionContext configured!
javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:9
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:9
javax.faces.component.UICommand.broadcast(UICommand.java:311)
javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:781)
javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1246)
com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:77)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:30
root cause
org.hibernate.HibernateException: No CurrentSessionContext configured!
org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:685)
database.ClienteDao.<init>(ClienteDao.java:16)
beans.ClienteBean.listaClientes(ClienteBean.java:26)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.apache.el.parser.AstValue.invoke(AstValue.java:262)
org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:27
com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:102)
javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:84)
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:9
javax.faces.component.UICommand.broadcast(UICommand.java:311)
javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:781)
javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1246)
com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:77)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:30
No Exemplo que estou vendo no site do Hibernate, está com hibernate.cfg.xml e não com hibernate.properties como estou usando. Está vai ser o problema ou está faltando alguma coisa?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/02/2012 19:42:30
|
Trebloc
JavaChild
![[Avatar]](/images/avatar/a6ac15a15c2dbbff1868a0ea531a9ccd.png)
Membro desde: 21/02/2010 03:46:13
Mensagens: 120
Localização: Brasília - DF
Offline
|
gmantovani2005, pode postar seu hibernate.properties?
Acho que faltou, como a exceção mesmo diz, você configurar um "current session context". Aqui tem alguém que relatou o mesmo problema que você, mas ele usa um hibernate.cfg.xml. Pro properties acho que o nome da propriedade é o mesmo (current_session_context_class):
http://stackoverflow.com/questions/761480/hibernate-no-currentsessioncontext-configured
|
"In Javadoc we trust!"
Bacharel em Ciência da Computação
Oracle Certified Professional, Java SE 6 Programmer |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/02/2012 22:59:33
|
gmantovani2005
Debugger
Membro desde: 27/03/2008 13:12:51
Mensagens: 54
Localização: Maringá - PR / Brasil
Offline
|
Adicionei o "current session context" e mesmo assim apresenta erro, já tentei de varias formas.
Veja o erro:
javax.servlet.ServletException: org.hibernate.HibernateException: No session currently bound to execution context
javax.faces.webapp.FacesServlet.service(FacesServlet.java:321)
root cause
javax.faces.el.EvaluationException: org.hibernate.HibernateException: No session currently bound to execution context
javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:9
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:9
javax.faces.component.UICommand.broadcast(UICommand.java:311)
javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:781)
javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1246)
com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:77)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:30
root cause
org.hibernate.HibernateException: No session currently bound to execution context
org.hibernate.context.ManagedSessionContext.currentSession(ManagedSessionContext.java:74)
org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:687)
com.gmail.gmantovani2005.database.ClienteDao.<init>(ClienteDao.java:13)
com.gmail.gmantovani2005.beans.ClienteBean.listaClientes(ClienteBean.java:26)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.apache.el.parser.AstValue.invoke(AstValue.java:262)
org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:27
com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:102)
javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:84)
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:9
javax.faces.component.UICommand.broadcast(UICommand.java:311)
javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:781)
javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1246)
com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:77)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:30
Arquivo hibernate.properties
Estou seguindo https://community.jboss.org/wiki/OpenSessionInView#A8.
Fiz o segundo filtro e não o primeiro e mesmo assim apresenta o erro acima.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/02/2012 03:01:28
|
Trebloc
JavaChild
![[Avatar]](/images/avatar/a6ac15a15c2dbbff1868a0ea531a9ccd.png)
Membro desde: 21/02/2010 03:46:13
Mensagens: 120
Localização: Brasília - DF
Offline
|
Como você definiu que seu contexto de sessão é gerenciado pela org.hibernate.context.ManagedSessionContext, você tem que fazer desse modo aqui:
http://www.17od.com/2006/11/06/using-managed-sessions-in-hibernate-to-ease-unit-testing/
Ou seja, manualmente utilizar os métodos bind e unbind da classe:
http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/context/ManagedSessionContext.html
Creio que isso ficaria no seu filtro.
|
"In Javadoc we trust!"
Bacharel em Ciência da Computação
Oracle Certified Professional, Java SE 6 Programmer |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/02/2012 13:48:49
|
gmantovani2005
Debugger
Membro desde: 27/03/2008 13:12:51
Mensagens: 54
Localização: Maringá - PR / Brasil
Offline
|
Desculpa minha ignorância, mas eu estava me matando atoa....
Eu fiz a declaração do Filtro por anotação e estava errado...Tirei a anotação e declarei o filtro por web.xml e agora está funcionando.
Eu utilizei o Filtro de Exemplo do link:
https://community.jboss.org/wiki/OpenSessionInView#A8
Muito bom material do Hibernate.
Este link também me fez entender melhor algumas coisas sobre Dao e Transactions do Hibernate.
Segue links que tem dentro dele:
https://community.jboss.org/wiki/SessionsAndTransactions
https://community.jboss.org/wiki/GenericDataAccessObjects
Agora que entendi isto vou terminar o que eu estava fazendo e depois usar o framework do Spring (tentar).
Tenho mais uma pergunta sobre a utilização dos Filtros.
Se eu for utilizar um pequeno controle de usuário também usaria filtros.
Dai eu crio outro filtro ou utilizo o mesmo?
This message was edited 1 time. Last update was at 25/02/2012 13:49:33
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/02/2012 15:47:11
|
Trebloc
JavaChild
![[Avatar]](/images/avatar/a6ac15a15c2dbbff1868a0ea531a9ccd.png)
Membro desde: 21/02/2010 03:46:13
Mensagens: 120
Localização: Brasília - DF
Offline
|
gmantovani2005 wrote:
Desculpa minha ignorância, mas eu estava me matando atoa....
Eu fiz a declaração do Filtro por anotação e estava errado...Tirei a anotação e declarei o filtro por web.xml e agora está funcionando.
Eu utilizei o Filtro de Exemplo do link:
https://community.jboss.org/wiki/OpenSessionInView#A8
Muito bom material do Hibernate.
Este link também me fez entender melhor algumas coisas sobre Dao e Transactions do Hibernate.
Segue links que tem dentro dele:
https://community.jboss.org/wiki/SessionsAndTransactions
https://community.jboss.org/wiki/GenericDataAccessObjects
Agora que entendi isto vou terminar o que eu estava fazendo e depois usar o framework do Spring (tentar).
Tenho mais uma pergunta sobre a utilização dos Filtros.
Se eu for utilizar um pequeno controle de usuário também usaria filtros.
Dai eu crio outro filtro ou utilizo o mesmo?
Poderia ser feito tudo em um único filtro, mas normalmente separa-se as responsabilidades: cada filtro é responsável por uma única coisa.
Só lembre-se que os filtros são uma cadeia:
Contêiner -> Filtro1 -> Filtro2 -> Filtro3 -> ... -> FiltroN -> Servlet (FacesServlet, no caso do JSF)
E a ordem em que são chamados você define no web.xml (os que forem definidos primeiro, vem primeiro na cadeia).
|
"In Javadoc we trust!"
Bacharel em Ciência da Computação
Oracle Certified Professional, Java SE 6 Programmer |
|
|
 |
|
|