[Logo] Mentawai Forum - Mentawai Web Framework
  [Search] Search   [Recent Topics] Recent Topics   [Members]  Member Listing   [Groups] Back to home page 
[Register] Register / 
[Login] Login 
Filtro do Hibernate (Dúvida)  XML
Forum Index -> Comentários Gerais
Author Message
Glaucio


[Avatar]

Joined: 20/07/2005 08:22:57
Messages: 52
Offline

Gostaria de saber como esse filtro funciona. Pelo o que eu entendi lendo a API, o filtro abre e fecha a conexão do Hibernate, não precisando fechar a sessão na mão.

Gostaria de saber se ele fecha a sessão antes que a resposta seja enviada ao cliente e se ele executa um commit no banco antes de fechar.


Glaucio Guerra
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline

Acho que o filtro está fechando a sessão antes de fazer o forward, o que pode estar te complicando a vida.

Mas se deixar para fechar depois do forward, como vc vai fechar essa sessão ??????

Acho que o Rubem pode te dar uma ajudada com isso...

Sergio Oliveira

RubemAzenha


[Avatar]
Joined: 30/06/2005 23:12:02
Messages: 472
Location: São Paulo, SP
Offline

Olá

apesar de eu ter implementado esse filtro não recomendo o seu uso. o correto é usar DAOs+HibernateUtil
http://www.hibernate.org/hib_docs/v3/reference/en/html/quickstart.html#quickstart-playingwithcats

Veja a classe HibernateUtil


Mentawai Developer
[WWW] [MSN]
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline

Dependendo do caso dá para usar sim !!!

Por exemplo, vc pode usar a interface ModelDriven para injetar a session diretamente no seu MODEL.


Sergio Oliveira

RubemAzenha


[Avatar]
Joined: 30/06/2005 23:12:02
Messages: 472
Location: São Paulo, SP
Offline

Dá pra usar, mas neste caso um HibernateUtil seria bem melhor, principalmente por que ele vai manter uma unica session(hibernate) para a mesma thread\session(HTTP), não vai ficar abrindo uma nova session(hibernate) a cada request. é o que eu tenho ouvido falar por aí.


Mentawai Developer
[WWW] [MSN]
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline

Mas o filtro tb só vai abrir uma session por thread, isto é, por request. Dá exatamente no mesmo, não?

Sergio Oliveira

flaviomreis


[Avatar]
Joined: 21/03/2006 11:23:28
Messages: 75
Offline

Olá... estou começando a utilizar agora mentawai com hibernate e já estou utilizando o HibernateFilter, só que tenho enfrentado algumas dificuldades e parece que pode ser no momento mesmo de fechar a sessão, se é antes da execução do Forward ou depois. Vou colocar aqui o meu simples problema para que, quem sabe, possam me ajudar.

Estou utilizando o IDE Netbeans 5, hibernate 3.1 e mentawai 1.2. O browser é o Mozilla Firefox 1.5 e tenho testado a aplicação tanto em Debian (com postgresql e JDK 1.6 beta) quanto em Windows XP (com mysql JDK 1.5).

Estou fazendo um pequeno aplicativo que pede id de cliente (InVenda.jsp) que depois é analisado pela ação InVenda.java que da um forward para o formulário que pede o id do produto e a quantidade (InItemVenda.jsp) que é analisado pela ação InItemVenda.java e dá um forward novamente para InItemVenda.jsp solicitando um outro id e quantidade de produto e mostrando uma lista de itens da venda.

Minha primeira alternativa foi enviar o objeto venda pelo output e lá no jsp acessar o cliente e os itens de venda e pelos itens de venda acessar os produtos. Para tanto, defini minha coleção de itens de venda em venda com lazy="false".

Abaixo a listagem dos hbm.xml e das minhas actions e jsps:

Code:
 Venda.hbm.xml
 <hibernate-mapping>
    <class name="model.Venda">
       <id name="id">
          <generator class="native"/>
       </id>
       
       <property name="data"/>
       
       <set name="itensVenda" inverse="true" lazy="false">
          <key column="venda"/>
          <one-to-many class="model.ItemVenda"/>
       </set>
            
       <many-to-one name="cliente" class="model.Cliente"/>
    </class>
 </hibernate-mapping>
 


Code:
 ItemVenda.hbm.xml
 <hibernate-mapping>
     <class name="model.ItemVenda">
         <id name="id">
             <generator class="native"/>
         </id>
       
         <property name="quantidade"/>
         <property name="precoUnitario" type="big_decimal"/>
       
         <many-to-one name="Venda" class="model.Venda"/>
         <many-to-one name="Produto" class="model.Produto"/>
     </class>
 </hibernate-mapping>
 


Code:
 <hibernate-mapping>
     <class name="model.Produto">
         <id name="id">
             <generator class="native"/>
         </id>
       
         <property name="nome"/>
         <property name="precoUnitario" type="big_decimal"/>
         
         <many-to-one name="Grupo" class="model.Grupo"/>        
       
     </class>
 </hibernate-mapping>
 


Code:
 Cliente.hbm.xml
 <hibernate-mapping>
     <class name="model.Cliente">
         <id name="id">
             <generator class="native"/>
         </id>
       
         <property name="nome"/>
       
     </class>
 </hibernate-mapping>
 


Em InVenda.java eu instancio uma nova Venda e coloco-a no contexto de sessão (é assim que se chama? Contexto de sessão?) e recupero-a em InItemVenda.java. Tive problemas em obter a coleção de itens de Venda com venda.getItensVenda(), então eu fiz aquele load da venda para passá-lo de objeto destacado para persistente.

Code:
 public class InVenda extends BaseAction {
    
    public String execute() throws Exception {
       String inClienteId = input.getStringValue("clienteId");
       Integer clienteId;
       
       try {
          clienteId = Integer.valueOf(inClienteId);
       } catch (NumberFormatException e) {
 
          return ERROR;
       }
       
       Session hbSession = (Session)input.getValue(HibernateFilter.KEY);
       
       Cliente cliente = (Cliente)hbSession.get(model.Cliente.class, clienteId);
       
       Transaction transaction = hbSession.beginTransaction();
       Venda venda = new Venda();
       venda.setCliente(cliente);
       venda.setData(Calendar.getInstance().getTime());
       hbSession.save(venda);
       transaction.commit();
       
       session.setAttribute("venda", venda);
       
       return SUCCESS;
    }
    
 }
 


Code:
 public class InItemVenda extends BaseAction {
    
    public String execute() {
       Integer produtoId;
       Integer produtoQuantidade;
       
       try {
          produtoId = Integer.valueOf(input.getStringValue("produtoId"));
          produtoQuantidade = Integer.valueOf(input.getStringValue("produtoQuantidade"));
          
       } catch (NumberFormatException e) {
          return ERROR;
       }
       
       Venda venda = (Venda)session.getAttribute("venda");
 
       Session hbSession = (Session)input.getValue(HibernateFilter.KEY);
       Transaction transaction = hbSession.beginTransaction();
       
       venda = (Venda)hbSession.load(Venda.class, venda.getId());
       Produto produto = (Produto)hbSession.get(Produto.class, produtoId);
      
       ItemVenda itemVenda = new ItemVenda();
       itemVenda.setVenda(venda);
       itemVenda.setProduto(produto);
       itemVenda.setQuantidade(produtoQuantidade);
       itemVenda.setPrecoUnitario(produto.getPrecoUnitario());
       
       hbSession.save(itemVenda);
       transaction.commit();
       
       output.setValue("itensVenda", venda.getItensVenda());
       
       return SUCCESS;
    }
    
 }
 


Consigo realizar uma operação ou duas de InItemVenda.jsp e depois é apresentada a mensagem:
Code:
 exception
 
 javax.servlet.ServletException: javax.servlet.ServletException: javax.servlet.jsp.el.ELException: An error occurred while getting property "nome" from an instance of class model.Produto$$EnhancerByCGLIB$$880d5b28
 	org.mentawai.core.Controller.service(Controller.java:196)
 	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
 	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:362)
 
 root cause
 
 org.mentawai.core.ConsequenceException: javax.servlet.ServletException: javax.servlet.jsp.el.ELException: An error occurred while getting property "nome" from an instance of class model.Produto$$EnhancerByCGLIB$$880d5b28
 	org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:844)
 	org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:781)
 	org.apache.jsp.InItemVenda_jsp._jspService(InItemVenda_jsp.java:123)
 	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
 	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
 	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
 	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
 	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
 	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
 	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:362)
 	org.mentawai.core.Forward.forward(Forward.java:110)
 	org.mentawai.core.Forward.execute(Forward.java:94)
 	org.mentawai.core.Controller.service(Controller.java:192)
 	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
 	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:362)
 
 note The full stack trace of the root cause is available in the Apache Tomcat/5.5.9 logs.
 


Obrigado pela atenção amigos.

Flávio Menezes dos Reis
Bacharel em Sistemas de Informação
flaviomreis@gmail.com
[MSN]
 
Forum Index -> Comentários Gerais
Go to:   
Powered by JForum 2.1.6 © JForum Team