JSF 2.0 + Hibernate + Dao  XML
Índice dos Fóruns » Desenvolvimento Web
Autor Mensagem
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.
[Email] [MSN]
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
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?
[Email] [MSN]
Trebloc
JavaChild
[Avatar]

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
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

Trebloc
JavaChild
[Avatar]

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
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?
[Email] [MSN]
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.
Trebloc
JavaChild
[Avatar]

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
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?
[Email] [MSN]
Trebloc
JavaChild
[Avatar]

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
gmantovani2005
Debugger

Membro desde: 27/03/2008 13:12:51
Mensagens: 54
Localização: Maringá - PR / Brasil
Offline

Trebloc wrote: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


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.
[Email] [MSN]
Trebloc
JavaChild
[Avatar]

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
gmantovani2005
Debugger

Membro desde: 27/03/2008 13:12:51
Mensagens: 54
Localização: Maringá - PR / Brasil
Offline

Trebloc wrote: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.



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

[Email] [MSN]
Trebloc
JavaChild
[Avatar]

Membro desde: 21/02/2010 03:46:13
Mensagens: 120
Localização: Brasília - DF
Offline

gmantovani2005 wrote:
Trebloc wrote: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.



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
 
Índice dos Fóruns » Desenvolvimento Web
Ir para:   
Powered by JForum 2.1.8 © JForum Team