Usando DAO 2 vezes no mesmo servlet

3 respostas
Gustavo.L

Olá

Estou criando uma classe Noticia que possui o atributo destaque, que tem os valores principal e secundário.

Então quando eu cadastrar uma nova noticia como principal eu devo buscar no banco de dados uma principal e passa-la para secundária e só depois cadastrar a nova notícia, e estou usando o Hibernate para gerar as minhas classes.
O erro que da é que eu acho que não se pode usar o DAO + de 1 vez, tipo buscar o principal, setar como secundario e depois incluir.

Estou usando multipart pois tenho que upar uma foto para notícia...

minha jsp:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
        <title>JSP Page</title>
        <link rel="stylesheet" type="text/css" href="style.css" />

        <%
                    String op = "incluir";

                    if (request.getParameter("op") != null) {
                        op = request.getParameter("op");
                    }

                    Date date = new Date();
                    String data = new SimpleDateFormat("dd/MM/yyyy").format(date);

                    String at = "";
                    String de = "";
                    String pr = "";
                    String se = "";
                    String ne = "";

                    String titulo = "";
                    String caminho = "";
                    String id = "";
                    String conteudo = "";
                    String status = "";
                    String destaque = "";

                    if (op.equals("editar")) {
                        status = request.getParameter("status");
                        destaque = request.getParameter("destaque");
                        titulo = request.getParameter("titulo");
                        id = request.getParameter("id");
                        caminho = request.getParameter("caminho");
                        conteudo = request.getParameter("conteudo");
                    }
        %>

    </head>

    <body>
        <div id="main_content">
            <div id="center_banner">
                <jsp:include page="banner_Painel_Controle.jsp" />
            </div>
            <div id="page_content">
                <jsp:include page="menu_Painel_Controle.jsp" />
                <div id="right_section">
                    <div class="right_box">
                        <div class="title"> Formulario de Cadastro de Notícias</div>
                        <div class="content">
                            <br><br><br>
                            <form action="noticiaCRUD" method="POST" enctype="multipart/form-data">
                                <input type="hidden" name="id" value="<%=id%>" />
                                <input type="hidden" name="op" value="<%=op%>" />
                                <input type="hidden" name="data" value="<%=data%>" />
                                <table border="0">
                                    <tr>
                                        <td>Título:</td>
                                        <td><input type="text" name="titulo" value="<%=titulo%>" size="75"  /></td>
                                    </tr>
                                    <tr>
                                        <td>Foto:</td>
                                        <td><input type="file" name="caminho" value="<%=caminho%>" /></td>
                                    </tr>
                                    <tr><td>Status:                                            
                                        </td>
                                        <td><select name="status">
                                                <% if(status.equals("1")){
                                                    at = "selected";
                                                } if(status.equals("2")){
                                                    de = "selected";
                                                } %>
                                                <option value="1" <%=at%> >ATIVADA</option>
                                                <option value="2" <%=de%> >DESATIVADA</option>
                                            </select>  </td>
                                            
                                    </tr>
                                    <tr><td>Destaque:
                                        </td>
                                        <td><select name="destaque">
                                                <% if(destaque.equals("1")){
                                                    pr = "selected";
                                                } if(destaque.equals("2")){
                                                    se = "selected";
                                                } if(destaque.equals("3")){
                                                    ne = "selected";
                                                }%>
                                                <option value="3" <%=ne%> >&nbsp;</option>
                                                <option value="1" <%=pr%> >PRINCIPAL</option>
                                                <option value="2" <%=se%> >SECUNDÁRIA</option>
                                            </select>  </td>
                                    </tr>
                                    <tr>
                                        <td>&nbsp;</td>
                                        <td></td>
                                    </tr>
                                    <tr>
                                        <td valign="top" >Conteúdo:</td>
                                        <td><textarea style="width:99%" cols="10" rows="15" name="conteudo"><%=conteudo%></textarea></td>
                                    </tr>
                                    <tr>
                                        <td>&nbsp;</td>
                                        <td></td>
                                    </tr>
                                    <tr>
                                        <td align="right" ><input  type="submit" value="&nbsp;&nbsp;&nbsp;Enviar &nbsp;&nbsp;&nbsp;" /></td>
                                        <td width="120" align="center" ><input  type="reset" value="&nbsp;&nbsp;Resetar&nbsp;&nbsp;" /></td>
                                    </tr>
                                </table>
                            </form>
                        </div>
                    </div>
                    <div class="right_box"></div>
                </div>
            </div>
        </div>
    </body>
</html>

Servlet q uso para incluir, editar, etc..

public class noticiaCRUD extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, FileUploadException {
        try {
            response.setContentType("text/html;charset=iso-8859-1");
            String caminho = "";//request.getParameter("caminho");
            String arq = "";
            caminho = caminho.replace('\\', '/');
            String titulo = "";
            String conteudo = "";
            String op = "";
            String id = "";
            String data = "";
            String status = "";
            String destaque = "";

            String caminhoTemp = getServletContext().getRealPath("/") + "/temp";
//String pasta="c:\\arquivos 01\\";
            String pasta = getServletContext().getRealPath("/") + "arquivos/pos/noticia/";
//String pasta="/home/"+site+"/public_html/upload/";
//String descricao  .getHeader("nome");
            NoticiaDAO dao = new NoticiaDAO();
            if (FileUpload.isMultipartContent(request)) {

                DiskFileUpload upload = new DiskFileUpload();
                upload.setRepositoryPath(caminhoTemp);
                upload.setSizeMax[telefone removido]);

                List items = upload.parseRequest(request);
                Iterator iter = items.iterator();
                while (iter.hasNext()) {
                    FileItem item = (FileItem) iter.next();
                    if (!item.isFormField()) {
                        if (item.getFieldName().equals("caminho")) {
                            try {
                                caminho = pasta + item.getName().toString();
                                File arquivo = new File(caminho);
                                item.write(arquivo);
                                arq = arquivo.getName();
                            } catch (Exception ex) {
                                Logger.getLogger(noticiaCRUD.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                    }
                    if (item.isFormField()) {

                        if (item.getFieldName().equals("op")) {
                            op = item.getString();
                        }
                        if (item.getFieldName().equals("titulo")) {
                            titulo = item.getString();
                        }
                        if (item.getFieldName().equals("conteudo")) {
                            conteudo = item.getString();
                        }
                        if (item.getFieldName().equals("data")) {
                            data = item.getString();
                        }
                        if (item.getFieldName().equals("destaque")) {
                            destaque = item.getString();
                        }
                        if (item.getFieldName().equals("status")) {
                            status = item.getString();
                        }
                    }
                }

                int status2 = Integer.parseInt(status);
                int destaque2 = Integer.parseInt(destaque);
                Date date = new Date();
                date = new SimpleDateFormat("dd/MM/yyyy").parse(data);

                if (op.equals("incluir")) {

                    Noticia noticia = new Noticia();
                    Noticia noticia2 = new Noticia();
                    
                    if (destaque2 == 1) {
                        
                        List<Noticia> principal = dao.buscarPrincipal(1);                        
                        noticia2.setIdNoticia(principal.get(0).getIdNoticia());
                        noticia2.setConteudo(principal.get(0).getConteudo());
                        noticia2.setData(principal.get(0).getData());
                        noticia2.setFoto(principal.get(0).getFoto());
                        noticia2.setTitulo(principal.get(0).getTitulo());
                        noticia2.setStatus(principal.get(0).getStatus());
                        noticia2.setDestaque(3);
                        dao.editar(noticia2);

                    }

                    noticia.setTitulo(titulo);
                    noticia.setConteudo(conteudo);
                    noticia.setFoto(arq);
                    noticia.setData(date);
                    noticia.setDestaque(destaque2);
                    noticia.setStatus(status2);
                    dao.incluir(noticia);                   

                }
                if (op.equals("editar")) {

                    Noticia noticiae = new Noticia();
                    int ide = Integer.parseInt(id);

                    noticiae.setTitulo(titulo);
                    noticiae.setFoto(arq);
                    noticiae.setConteudo(conteudo);
                    noticiae.setIdNoticia(ide);
                    noticiae.setData(date);
                    noticiae.setDestaque(destaque2);
                    noticiae.setStatus(status2);

                    dao.editar(noticiae);
                }
            }

        } catch (ParseException ex) {
            Logger.getLogger(noticiaCRUD.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            RequestDispatcher rd = null;
            rd = request.getRequestDispatcher("listaNoticia.jsp");
            rd.forward(request, response);
        }
    }
}

Não da erro no browser, só que simplesmente ele cadastra noticia quando é de nenhum tipo, ou seja, destaque igual a 3, e quando destaque igual a 2 que será secundária mas quando destaque igual e 1 não inclui nem nada...

Erro do apache:

19/04/2011 13:52:10 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet noticiaCRUD threw exception
org.hibernate.SessionException: Session was already closed
        at org.hibernate.impl.SessionImpl.close(SessionImpl.java:275)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301)
        at $Proxy1.close(Unknown Source)
        at controle.NoticiaDAO.incluir(NoticiaDAO.java:20)
        at servlet.noticiaCRUD.processRequest(noticiaCRUD.java:122)
        at servlet.noticiaCRUD.doPost(noticiaCRUD.java:180)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
        at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
        at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
        at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
        at java.lang.Thread.run(Thread.java:662)

thanks :)

3 Respostas

magnocosta

Ola Gustavo,

Tem algumas linhas ae que podem resultar em algum problema futuramente.
Mas vamos ao nosso problema atual, caso ocorra outro erro vc posta ae e agente confere.

O erro que esta acontecendo é que o Hibernate esta tentando fazer alguma operação com o banco de dados, mas a conexao (conhecida como sessão) está fechada.

Por isso a mensagem “Session was already closed”

A pergunta é como vocé esta pegando a sessao do HIbernate no seu Dao?

Se não souber responder posta o seu Dao ae p gente da uma olhadinha !

ABRACAOO !!

Gustavo.L

Simm, foi mal sabia q tava esquecendo algo..

O NoticiaDAO:

package controle;

import entidade.Noticia;
import java.util.List;
import org.hibernate.Session;
import util.HibernateUtil;

public class NoticiaDAO {

    Session s = HibernateUtil.getSessionFactory().getCurrentSession();

    public NoticiaDAO() {
        //s.beginTransaction();
    }

    public void incluir(Noticia no) {
        s.beginTransaction();
        s.save(no);
        s.getTransaction().commit();
        s.close();
    }

    public void editar(Noticia no) {
        s.beginTransaction();
        s.update(no);
        s.getTransaction().commit();
        s.close();
    }

    public void excluir(Noticia no) {
        s.beginTransaction();
        s.delete(no);
        s.getTransaction().commit();
        s.close();
    }

    public List<Noticia> listarTodos() {
        s.beginTransaction();
        List<Noticia> lista = (List<Noticia>) s.createQuery("From Noticia").list();
        s.getTransaction().commit();
        return lista;
    }

    public List<Noticia> buscarPrincipal(int id) {
        s.beginTransaction();
        List<Noticia> lista = (List<Noticia>) s.createQuery("From Noticia where destaque='" + id + "'").list();
        s.getTransaction().commit();
        return lista;
    }

    public List<Noticia> buscarNoticia(int id) {
        s.beginTransaction();
        List<Noticia> lista = (List<Noticia>) s.createQuery("From Noticia where id='" + id + "'").list();
        s.getTransaction().commit();
        return lista;
    }
}

vlw ae

magnocosta

Uhmm … Conforme imagineii

Voce esta fechando a session sempre q e executado um metodo da sua classe

s.close();

Uma alternativa p resolver o seu problema e passar o objeto Session para o seu controler, no caso noticiaCRUD e passa-lo npara o dao no construtor e somente no final da sua requisicão vc da um close. Tipo:

  1. Adicione essa linha na sua classe noticiaCRUD.
Session s = HibernateUtil.getSessionFactory().getCurrentSession();

obs: Retire ela da sua classe NoticiaDao

  1. Retire todas essas linhas do seu NoticiaDao
s.beginTransaction();  
s.getTransaction().commit();  
s.close();

3)Acrescente a linha abaixo na classe noticiaCRUD no seu metodo processRequest :

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, FileUploadException {  
 s.beginTransaction();
  1. Acrescente no final do seu método processRequest :
s.getTransaction().commit();  
s.close();

ficando assim :

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, FileUploadException {  
 s.beginTransaction();  
 .
 .
 .
 .
 s.getTransaction().commit();  
 s.close(); 
}
  1. Acrescente o atributo Session na sua classe NoticiaDao:
private Session s;
  1. Mude o construtor da sua classe NoticiaDao para
public NoticiaDAO(Session session) {  
  this.s = session;
}

PRONTO !!!

Explicandooo !

Todo inicio de requisicao vc vai abrir uma sessao e uma transação com o banco de dados e passar essa sessao q foi aberta para o seus daos
Todos os seus daos terao essa estrutura.

Apesar d funcionar não é a melhor forma de trabalhar com o Hibernate. Pois a melhor forma e trabalhar com “View Open Session” (axo q o nome e esse, procura no google)

Mas apesar dessas linhas acredito que seu código ainda terá q mudar algumas coisas para funcionar perfeito, mas o problema com “Session was already closed” não te pertubará mais

Obs: vc vai ter q alterar todos os seus servlets q utilizam o seus daos para este modelo.

Espero q tenha ajudado !
Qualquer dúvida posta ae !

Abraçãooo !

Criado 19 de abril de 2011
Ultima resposta 19 de abr. de 2011
Respostas 3
Participantes 2