| Author |
Message |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/08/2005 10:26:54
|
Glaucio
![[Avatar]](/images/avatar/c51ce410c124a10e0db5e4b97fc2af39.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/08/2005 19:18:39
|
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/08/2005 17:23:01
|
RubemAzenha
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/08/2005 17:31:32
|
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/08/2005 00:00:41
|
RubemAzenha
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/08/2005 10:00:38
|
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 21/03/2006 11:59:04
|
flaviomreis
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 |
|
|
 |
|
|