Passo 1
(Este tutorial foi desenvolvido por Cleber Calvi)

 

Gravação de Dados!

Vamos criar a nossa tela (simples) onde pegaremos os dados a serem registrados na base de dados. Ex:

Mantendo um padrão de desenvolvimento, na pasta Source teremos as seguintes camadas:

View > beans;
Service > camada responsável por fazer a comunição entre a view e a dao, fazendo tratamentos e conversões de dados, passando os dados de maneira clara para ambas as camadas;
DAO > camada responsável por trabalhar com a base de dados.

 

Criaremos uma base de dados, nela criaremos uma tabela e a seguinte stored procedure:

create procedure gravar
  @nome varchar(20),
  @idade decimal(10,0)
  AS
  if exists (select nome from dados where nome=@nome)
    begin
       select ‘D’
  end
  else
    begin
      insert into dados
      values (@nome, @idade)
      select ‘O’
end

Obs.: lembrando que essa é uma procedure simples e que devemos evitar clausulas where comparando “Strings”.

Criada nossa procedure, vamos as classes Java.
Criaremos no bean o seguinte método:

public String gravar(){
   String retorno=null;
   String status;
   status = service.gravar(this.nome, this.idade);
   if(status.equals(“D”) || status.equals(“F”)){
      retorno = “falha”;
   }else{
      retorno = “sucesso”;
   }
   return retorno;
}

 

Agora iremos criar a classe service que deverá ficar semelhante ao código abaixo:

package br.com.web.control.service;
import br.com.web.control.dao.HibernateDAO;

public class HibernateService{
       private HibernateDAO dao = new HibernateDAO();
       //Construtor
       public HibernateService(){
       }
       public String gravar(String nome, int idade){
          String retorno;
          try{
             retorno = dao.gravar(nome, idade);
          }catch (Exception e) {
             retorno = “E”;
          }
       return retorno;
       }
}

Obs.: lembrando que o package e o importe irão variar de acordo com a estrutura e nomes do seu projeto.

E finalmente a classe DAO:

package br.com.web.control.dao;
import org.hibernate.Query;
import org.hibernate.Transaction;
import org.hibernate.classic.Session;

public class HibernateDAO{
    //Objeto para manuseio da classe de Conexao
    Conexao conexao = new Conexao();

    //Construtor
    public HibernateDAO(){
    }

    public String gravar(String nome, int idade) throws Exception{
        Session session = getConexao().getSession();
        String retorno = null;
        Query query = null;
        try{
           Transaction trans = session.beginTransaction();
           query = session.getNamedQuery(“gravar”);
           query.setString(0, nome);
           query.setInteger(1, idade);
           retorno = String.valueOf(query.uniqueResult());
           trans.commit();
        }catch(Exception he) {
           throw new Exception();
        } finally{
           session.close();
        }
        return retorno;
    }

    public Conexao getConexao() {
        return conexao;
    }

    public void setConexao(Conexao conexao) {
        this.conexao = conexao;
    }
}

E a classe conexão:

package br.com.web.control.dao;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

public class Conexao {
    //Objeto que irá conter a configuração de conexão
    private SessionFactory factory;
    //Método construtor
    public Conexao(){ };

    /* Método que configura a conexão com o hibernate
    * abre e retorna uma sessão */
    public Session getSession(){
        this.factory = new Configuration().configure().buildSessionFactory();
        Session session = this.factory.openSession();
        return session;
    }
}

 

Bom, até agora muito código e pouca explicação né! Vamos agora explicar um pouco o que foi feito.

O bean é responsável por pegar os dados da tela e enviar para a camada service, ao receber os dados de volta ele irá verificar para qual tela ele deve direcionar a aplicação através do status, que nada mais é que o retorno da classe Service.

A camada service está pegando os dados e enviando para a camada DAO, caso haja algum erro na camada DAO, a service irá tratar esse erro mandando uma mensagem de status “F” que trataremos como erro, caso não dê problema apenas repassa o valor recebido da stored procedure.

A camada DAO é responsável por toda a parte de base de dados, para isso criamos a classe “dao” que irá receber os valores da service, abrir uma sessão através da classe “Conexão” (Session session = getConexao().getSession();), montar e executar a query (Transaction trans = session.beginTransaction(); query = session.getNamedQuery(“gravar”); query.setString(0, nome); query.setInteger(1, idade); retorno = String.valueOf(query.uniqueResult()); trans.commit();) .

A classe Conexão apenas cria a sessionFactory baseado no arquivo hibernate.cfg.xml.

Porém para que tudo isso funcione ainda é necessário criar o “hbm.xml” que terá como primeiro nome, o mesmo que foi dado a sua base de dados, nesse caso “HBM.hbm.xml”.

<?xml version=“1.0″ encoding=“UTF-8″?>
<!DOCTYPE hibernate-mapping PUBLIC “-//Hibernate/Hibernate Mapping DTD//EN”
     “http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”>
<!– ************************************************************************************************ –>
<!– Mapeamento de Stored Procedures que usamos na aplicalção –>
<!– ************************************************************************************************ –>
<hibernate-mapping auto-import=”true” default-lazy=”false”>
      <sql-query name=“gravar” callable=“true”>
            <return-scalar column=“mensagem” type=“string” />
            { call gravar(?,?) }
      </sql-query>
</hibernate-mapping>

 

Nesse arquivo é que serão mapeadas as procedures que serão chamadas e seus retornos. No caso da gravação onde teremos apenas uma mensagem, o mapeamento é simples como o apresentado acima.