Hibernate


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.

Este tutorial foi desenvolvido por Cleber Calvi!

Hibernate é um framework para mapeamento de objeto-relacional, simplificando, ele faz um “de/para” da tabela para a classe mediante uso de arquivos XML. O objetivo do Hibernate é diminuir a complexidade entre os programas orientados a objeto (JAVA) que precisam trabalhar com um banco de dados do modelo relacional que é o mais comum. Em especial, no desenvolvimento de consultas e atualizações dos dados.

Funciona mais ou menos assim: Existe um arquivo de configuração para cada tabela, com a descrição da tabela e a forma de conexão, quando quisermos fazer um “select” não precisamos criar todo um método com JDBC e querys, basta fazer um simples “getTabela()” e pronto, os dados irão aparecer, como mágica!

Agora saindo um da teoria e indo à pratica, neste post iremos mostrar um pouquinho do potencial desse framework.

O hibernate não é um modelo de desenvolvimento de portais, mas sim uma forma de comunicação com o banco de dados na MVC ele estaria na camada MODEL. Para utilizá-lo é necessário já possuir uma aplicação pronta, os exemplos utilizados aqui têem como base o ProjetoX desenvolvido em JSF, ou seja para prosseguir com este tutorial é necessário:

1 – Conhecimento básico em JSF
2 – Ter SQLServer instalado
Nota: Pode ser outra base de dados, basta informar o driver correto nos arquivos de configuração, porém os exemplos utilizados neste tutorial foram construidos sobre um SQLServer.
3 – Efetuar o download das bibliotecas do Hibernate e Drivers de Conexão.

Agora que o download das bibliotecas foi efetuado, podemos criar o arquivo de configuração (lembre-se que todos os arquivos de configuração devem ser criados dentro da pasta WEB-INF).

Crie o arquivo hibernate.cfg.xml e insira as seguintes linhas de código:

<!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=“show_sql”>true</property>
            <property name=“hibernate.dialect”>org.hibernate.dialect.SQLServerDialect</property>
            <property name=hibernate.connection.driver_class”>com.microsoft.jdbc.sqlserver.SQLServerDriver</property>
            <property name=“hibernate.connection.url”>jdbc:microsoft:sqlserver://[IP-Servidor]:[Porta];DatabaseName=HBM;SelectMethod=Cursor;</property>
            <property name=“hibernate.connection.username”>sa</property>
            <property name=“hibernate.connection.password”>admin</property>
                 <mapping resource=HBM.hbm.xml”/>
      </session-factory>
</hibernate-configuration>
Explicando um pouco:

<property name=“hibernate.dialect”>XXX</property> este é inserido o dialeto que o hibernate utilizará para entender a base de dados, até algum tempo atrás o hibernate não tinha suporte a stored procedure para mysql, pois não havia sido criado o dialeto para tal, caso queira utilizar outro banco de dados basta informar o dialeto correspondente (e baixar o Jar necessário, também).

<property name=“hibernate.connection.driver_class”>XXX</property> aqui é inserido o caminho do driver de conexão, este é encontrado no “jar” mssqlserver.jar que adicionamos ao nosso projeto, assim como no dialeto, se desejar utilizar outro banco de dados, basta efetuar o download do driver de conexão e informá-lo nesta tag.

<property name=“hibernate.connection.url”>XXX</property> aqui define-se onde está localizada e qual o nome da base que será utilizada, sendo [IP-Servidor] o nome ou IP da sua máquina e [Porta] a porta padrão do sqlserver (ou o seu banco de dados).

No próximo post, Gravação de dados!