Hibernate + Servlet. Como salvar?

9 respostas
J

Pessoal, estou começando a usar o hibernate agora e estou tendo problemas, já fiz tudo que sei e li, tudo como manda o figurino: criei a minha entidade, coloquei as anotações, criei meu dao, o jsp e meu servlet, já fiz meu arquivo de configuração do hibernate - hibernate.cfg.xml. Mas na hora de salvar, nada acontece, só mostra na tela os dados recuperados por POST e no banco nao acontece nada, não sei o que estou fazendo de errado, ou deixando de fazer, se alguem puder me ajudar.

Pessoa.java
package br.com.teste.modelo;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="pessoa")
public class Pessoa implements Serializable {

    private static final long serialVersionUID = 2174678509151116408L;

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    @Column(name="pessoa_id")
    private int id;

    @Column(name="nome")
    private String nome;

    @Column(name="email")
    private String email;

    @Column(name="cpf")
    private int cpf;

    @Column(name="data_nascimento")
    private String dataNascimento;

    @Column(name="celular")
    private String telefoneCelular;

    public int getId() {
            return id;
    }
    
    public void setId(int id) {
            this.id = id;
    }

    public String getNome() {
            return nome;
    }

    public void setNome(String nome) {
            this.nome = nome;
    }

    public String getEmail() {
            return email;
    }

    public void setEmail(String email) {
            this.email = email;
    }

    public int getCpf() {
            return cpf;
    }

    public void setCpf(int cpf) {
            this.cpf = cpf;
    }

    public String getDataNascimento() {
            return dataNascimento;
    }

    public void setDataNascimento(String dataNascimento) {
            this.dataNascimento = dataNascimento;
    }

    public String getTelefoneCelular() {
            return telefoneCelular;
    }

    public void setTelefoneCelular(String telefoneCelular) {
            this.telefoneCelular = telefoneCelular;
    }

}
PessoaDAO.java:
package br.com.teste.dao;

import br.com.teste.modelo.Pessoa;
import java.util.List;
import org.hibernate.Session;


public class PessoaDAO {

    private Session sessao;

    public PessoaDAO(Session sessao) {
        this.sessao = sessao;
    }

    public void Inserir(Pessoa p) {
        this.sessao.save(p);
    }

    public void Remover(Pessoa p) {
        this.sessao.delete(p);
    }

    public void Atualizar(Pessoa p) {
        this.sessao.merge(p);
    }

    public List<Pessoa> listaTudo() {
        return this.sessao.createCriteria(Pessoa.class).list();
    }

    public Pessoa Procurar(int id) {
        return (Pessoa) sessao.load(Pessoa.class, id);
    }

}
hibernate.cfg.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://10.0.0.15:3306/teste1</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password"></property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.format_sql">true</property>
    <mapping class="br.com.teste1.modelo.Pessoa" />
  </session-factory>
</hibernate-configuration>
HibernateUtil.java:
package br.com.teste.util;

import org.hibernate.Session;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;

public class HibernateUtil {

    private static final SessionFactory sessionFactory;

    static {
        try {
            // Create the SessionFactory from standard (hibernate.cfg.xml) 
            // config file.
            sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            // Log the exception. 
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public static Session getSession() {
        return sessionFactory.openSession();
    }
}
index.jsp:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <form name="cadastraPessoa" action="PessoaServlet" method="post">
            Nome: <input type="text" name="nome" value="" /><br />
            E-mail: <input type="text" name="email" value="" /><br />
            CPF: <input type="text" name="cpf" value="" /><br />
            Data Nascimento: <input type="text" name="dataNascimento" value="" /><br />
            Celular: <input type="text" name="celular" value="" /><br />
            <input type="submit" value="Inserir" />
        </form>
    </body>
</html>
PessoaServlet:
package br.com.teste.servlets;

import br.com.teste.dao.PessoaDAO;
import br.com.teste.modelo.Pessoa;
import br.com.teste.util.HibernateUtil;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;

public class PessoaServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
       
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        try {
            String nome = request.getParameter("nome");
            String email = request.getParameter("email");
            int cpf = Integer.parseInt(request.getParameter("cpf"));
            String dataNascimento = request.getParameter("dataNascimento");
            String celular = request.getParameter("celular");

            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet PessoaServlet</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("Nome: " + nome + "<br />");
            out.println("E-mail: " + email + "<br />");
            out.println("CPF: " + cpf + "<br />");
            out.println("Data Nascimento: " + dataNascimento + "<br />");
            out.println("Celular: " + celular + "<br />");
            out.println("</body>");
            out.println("</html>");

            SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
            Session session = HibernateUtil.getSession();

            Pessoa p = new Pessoa();
            p.setNome(nome);
            p.setEmail(email);
            p.setCpf(cpf);
            p.setDataNascimento(dataNascimento);
            p.setTelefoneCelular(celular);

            try {
                PessoaDAO dao = new PessoaDAO(session);
                Transaction t = session.beginTransaction();
                dao.Inserir(p);
                t.commit();
            }
            catch (Exception e) {
                out.println("Nao salvou!");
            }
            finally {
                session.close();
            }
        }
        finally {
            out.close();
        }
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }
}

Se alguem ver algum erro ou descobrir o que está faltando e puder me ajudar, serei muito grato.
Recaptulando: quando eu envio os dados do jsp para a servlet, essa apenas mostra os dados recuperados pelo POST e nada acontece no BD.

Desde ja argadeço.

9 Respostas

marcelo.bellissimo

Ao invés disso:

finally { session.close(); }
… tenta isso: finally { session.flush(); session.close(); }

Abdon

Ola,

<mapping class="br.com.teste1.modelo.Pessoa" />

Esta errado, olha o pacote que vc colocou na classe pessoa

br.com.teste.modelo

Não tem este 1 depois do teste, pode ser isso, quem sabe.

Abdon

Um conselho,

Não escreva na servlet a resposta que vc deseja, use uma jsp para isso ! É bem menos trabalhoso !

J

Escrevi a resposta no servlet porque estou apenas testando, estou tentando aprender hibernate e colocar alguma coisa, mesmo que simples pra rodar com ele, mas até agora nada, estou há um tempão tentando e nada. Ja fiz de tudo: troquei de IDE, de windows, comecei avançado e voltei pro básico, tentei várias vezes e não foi ainda.
Fiz o que vocês falaram e não funcionou, coloqueo o session.flush() e mudei o nome do meu pacote no mapeamento da minha classe, mas sem sucesso. Nao sei mais o que faço. E agora, pra piorar, do nada, o servlet parou de funcionar, nem mostra mais nada na tela, antes mostrava os dados, mas nao salvava, agora nem um nem outro.

J

Consegui fazer com que meu servlet voltasse a mostrar os dados recuperados do formulario na tela, era erro na conversão para inteiro.
Tentei mais algumas vezes, seguindo o que voces falaram e me baseando em exemplos da internet e nao salvou, coloquei (ou tentei) o log4j, mas nao mostra nenhum erro na tela nem acho nenhum arquivo de log, espero que tenha configurado e o colocado corretamente.
Alguem tem alguma sugestao do que esta errado ou faltando para eu conseguir salvar no BD?

Desde ja agradeço.

Abdon

Qual banco de dados vc esta utilizando para testar?

Reparei que vc esta usando uma GenerationType.SEQUENCE, para isso vc tem que ter um campo sequence em seu banco de dados. Isso normalmente é feito utilizando oracle.

Será que seu caso não seria utilizar uma GenerationType.IDENTITY?

J

Eu estou usando o mysql mesmo.

Voce acha melhor substituir para GenerationType.IDENTITY ou para GenerationType.AUTO?
Vou tentar aqui de novo.

J

Funcionou !!!
Caraca, não acredito.
Funciona com o GenerationType.AUTO e com o GenerationType.IDENTITY.
Qual é o melhor? Mesma coisa?

J

Pessoal,

Sei que não tem muito a ver com esse tópico, mas estou com outra dúvida, eu tenho esse método aqui:

public List<Pessoa> listaTudo() { return this.sessao.createCriteria(Pessoa.class).list(); }

Como que eu faço para mostrar todos os meus usuários salvos no meu BD dentro de um jsp ou de uma servlet?
Alguem pode me ajudar?

Criado 28 de janeiro de 2010
Ultima resposta 29 de jan. de 2010
Respostas 9
Participantes 3