Tutorial hibernate fase 1

Caros amigos,

Depois de um bom tempo correndo atrás de todas as dicas sobre Hibernate, consegui fazer uma aplicação funcionar, primeiro numa aplicação cliente/servidor e depois no ambiente web utilizando o TomCat.

Ferramentas utilizadas:

Java (jdk-1_5_0_06-windows-i586-p)
Eclipse (lomboz)
TomCat (jakarta-tomcat-5.5.10)
Hibernate 3.02
MySql 4.01

Vamos criar um novo projeto:
Clicar em File | new | project | TomCat project
Informe o nome: "SeuProjeto"
Em project contents, desmarque a opção “Use default”, clique em Browse e vá até a pasta webapps que fica dentro da pasta onde o TomCat foi instalado. Chegando nela, clique em “Criar nova pasta”, informe o nome dela “SeuProjeto” e clique direto em Finish.

Se voce clicar em Window | Show View | Navigator

O projeto deverá ter esta estrutura:

SeuProjeto
   WEB-INF
     classes
     lib
     src
   work

O grande problema para fazer funcionar o Hibernate é a configuração das pastas, saber quem é quem e onde colocar…

Baixe o Hibernate 3.02 e descompacte-o em alguma pasta no seu computador
Pegue tambem o drive do Mysql (mysql-connector-java-3.1.12-bin.jar) e coloque-o na pasta lib Vamos distribuir os arquivos:
O arquivo hibernate3.jar coloque-o na pasta raz do projeto (SeuProjeto)

Sei que não precisamos de todos mas vamos pecar por excesso:
Pegue todos os arquivos .jar do hibernate, juntamente com driver MySql e coloque-os na pasta lib

Depois você poderá fazer uma limpeza, retirando alguns mas sempre lembrando de testar a aplicação…

Vamos informar ao projeto que existem novos JARs
Com o projeto selecionado acesse o Menu clicando em:
Project | properties | java Build Pach | na aba Libraries | no botão ADD JARs
Serão exibidas as pasta do seu projeto, localize as pastas onde estão os arquivos JAR´s, selecione-os e clique em OK.

Peque os arquivos hibernate.properties e log4j.properties e coloque-os na pasta classes do projeto

Abra o hibernate.properties com algum editor (notepad) e altere os parametros de conformidade com a configuração da sua conexão com a base de dados (é moleza…mas extremamente importante, sem isto jamais o sistema encontrará a base de dados)
É algo parecido com isto:

hibernate.connection.driver_class = com.mysql.jdbc.Driver
hibernate.connection.url = jdbc:mysql://localhost:3306/SeuProjeto
hibernate.connection.username = usuario
hibernate.connection.password = senha

Importante: Todos arquivos criados a partir do tutorial, salvar na pasta src
Numa segunda fase, trabalhando com uma estrutura de camadas (apresentação, negócio e dados) informarei onde cada arquivo deverá ficar, por padrão.

Criando de classe Usuario, UsuarioDAO e mapeamento da classe:

Criar o arquivo conforme abaixo e salvar como Usuario.java

public class Usuario {
	private String usCod;
	private String usSenha;
	private String usNome;
	private String usEmail;

	public Usuario(){
	}		 

	public Usuario(String usCod, String usSenha, String usNome, String usEmail) {
		this.setUsCod(usCod);
		this.setUsSenha(usSenha);
		this.setUsNome(usNome);
		this.setUsEmail(usEmail);
	}

//... IMPORTANTE: colocar os métodos GETs e SETs... 

}

Vamos criar a Classe UsuarioDAO, responsavel pela conexao com a base de dados, salve-a como UsuarioDAO.java

import java.util.List;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.hibernate.criterion.Expression;

public class UsuarioDAO{
	
	private SessionFactory factory;
	
	public UsuarioDAO() throws Exception{
		factory = new Configuration().addClass(Usuario.class).buildSessionFactory();
		
	}     
	
	public void UsInserir(Usuario us) throws Exception {
		Session session = factory.openSession();
		session.save(us);
		session.flush();
		session.close();
	}
	
	public void UsAlterar(Usuario us) throws Exception {
		Session session = factory.openSession();
		session.update(us);
		session.flush();
		session.close();
	}
	public void UsExcluir(Usuario us) throws Exception {
		Session session = factory.openSession();
		session.delete(us);
		session.flush();
		session.close();
	}
}

Criando o mapeamento da classe para o Hibernate:

Criar o arquivo com os dados abaixo e salvar como Usuario.hbm.xml. Ele deverá ficar na mesma pasta do Usuario.java

Nota: O arquivo abaixo é um xml e para funcionar, retire o espaço que existe entre o sinal < e a linha de comando. Ele foi inserido para que o browser não interpretasse como tal.

&lt; ?xml version=&quot;1.0&quot;?&gt;
&lt; !DOCTYPE hibernate-mapping PUBLIC &quot;-//Hibernate Mapping DTD 3.0//EN&quot; 
&quot;hibernate-mapping-3.0.dtd&quot;&gt;

&lt; hibernate-mapping&gt;
   &lt; class name=&quot;Usuario&quot; table=&quot;tb_usuarios&quot;&gt;
       &lt; id name=&quot;UsCod&quot;  column=&quot;USCOD&quot;  type=&quot;string&quot;&gt;
            &lt; generator class=&quot;assigned&quot;/&gt;
        &lt; /id&gt;
        &lt; property name=&quot;UsSenha&quot; column=&quot;USSENHA&quot; type=&quot;string&quot;/&gt;
        &lt; property name=&quot;UsNome&quot; column=&quot;USNOME&quot; type=&quot;string&quot;/&gt;
        &lt; property name=&quot;UsEmail&quot; column=&quot;USEMAIL&quot; type=&quot;string&quot;/&gt;
    &lt; /class&gt;
&lt; /hibernate-mapping&gt;

Verifique que este xml será validado pelo arquivo hibernate-mapping-3.0.dtd.
Como voce ainda não tem este arquivo em sua máquina, faça uma busca rápida no professor google com o texto “hibernate-mapping-3.0.dtd” deverão surgir alguns links deste arquivo, quando voce clicar ele abrirá como um arquivo texto, peque o conteúdo e salve com o nome acima dentro da pasta raiz do seu projeto, no nosso caso, na pasta SeuProjeto.
Este recurso evita que o sistema não encontre o validador quando voce estiver rodando a plicação sem uma conexao com a web.

Caso voce não tenha criado a tabela na base de dados este script deverá criar a tabela.
Abra o admin do mysql e, dentro de uma nova query, cole o texto abaixo e execute-o:

/*
MySQL Data Transfer
Source Host&#58; localhost
Source Database&#58; seuprojeto
Target Host&#58; localhost
Target Database&#58; seuprojeto
Date&#58; 24/11/2006 06&#58;11&#58;53
*/

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for tb_usuario
-- ----------------------------
CREATE TABLE `tb_usuario` &#40;
  `USCOD` varchar&#40;50&#41; NOT NULL default '',
  `USSENHA` varchar&#40;50&#41; default NULL,
  `USNOME` varchar&#40;50&#41; default NULL,
  `USEMAIL` varchar&#40;50&#41; default NULL,
  PRIMARY KEY  &#40;`USCOD`&#41;
&#41; ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='InnoDB free&#58; 3072 kB';

-- ----------------------------
-- Records 
-- ----------------------------
INSERT INTO `tb_usuarios` VALUES &#40;'well', '123', 'wellington marinheiro', 'wmarinheiro@hotmail.com'&#41;;

Pronto !!! Até aqui temos:
Hibernate configurado dentro do projeto;
A Classe Usuario;
A Classe UsuarioDAO;
O Mapeamento;
A tabela no banco de dados;

Para testar esta fase, não vamos ainda para o TomCat, criaremos uma classe main para teste…

Copie o conteúdo abaixo em uma nova classe main e salve com o nome Teste.java, dentro da pasta src

public class Teste &#123; 
	
public static void main&#40;String&#91;&#93; args&#41; throws Exception &#123; 
		
	try 
	&#123; 
		String log = &quot;login&quot;; 
		String senha = &quot;abc&quot;; 
		String nome = &quot;Rafael&quot;; 
		String email = &quot;Rafael@email.com.br&quot;;

		UsuarioDAO dao = new UsuarioDAO; 
		Usuario usuario = new Usuario&#40;log,senha,nome,email&#41;;		
		dao.UsInserir&#40;usuario&#41;;
		System.out.println&#40;&quot;Registro inserido com sucesso!!!&quot;&#41;;
		&#125; 
		catch&#40;Exception e&#41; 
		&#123;    
			System.out.println&#40;&quot;Não foi possivel, Erro&#58; &quot; + e.getMessage&#40;&#41;&#41;; 
		&#125; 
	&#125; 
&#125;

Fazendo um resumo dos arquivos criados e seus locais:

SeuProjeto:
hibernate3.jar
hibernate-mapping-3.0.dtd
WEB-INF
classes
hibernate.properties
log4j.properties
Usuario.hbm.xml (Este vem automaticamente, não precisa salvar aqui…)

    [b]lib[/b]
        ...com todos os JARs trazidos do pacote Hibernate 3.2

  [b] src[/b]            
       hibernate.properties
       log4j.properties
       UsuarioDAO.java
       Teste.java
       Usuario.java
       Usuario.hbm.xml

Execute este arquivo e, se tudo estiver como descrito, voce terá inserido o primeiro registro numa base de dados utilizando o hibernate…

É pouco mas já é um começo, na proxima etapa, conforme prometido, vamos inserir registros num ambiente web, através de uma pagina jsp.

Este tutorial tambem poderá ser visto em http://www.livramento.yu.com.br/Hibernate.html

Tambem neste link, em breve estará disponiblizado um tutorial de como utilizar o MD5 em java, bem simples e bastante util, aguardem…

Espero ter ajudado,
Wellington Marinheiro
wmarinheiro@hotmail.com

Boa iniciativa Wellington, o tópico já está como fixo! :joia:

Cara… se todo mundo tivesse essa paciência como você Wellington, iriamos triplicar o número de “javeiros” hehehe… parabéns pela iniciativa… e espero que outros usuários se espelhem em você e dê uma força pra quem está começando … assim como você “me ajudou” hehe :lol:

Obrigado

Oiii…

então, fiz exatamente igual ao tutorial e deu erro (claro q não devo ter feito igual, senão teria funcionado, hehehehe).

2007-03-05 14&#58;19&#58;18,687 INFO hibernate.cfg.Configuration -&gt; Reading mappings from resource&#58; Usuario.hbm.xml 2007-03-05 14&#58;19&#58;19,296 ERROR hibernate.util.XMLHelper -&gt; Error parsing XML&#58; XML InputStream&#40;1&#41; The processing instruction target matching &quot;&#91;xX&#93;&#91;mM&#93;&#91;lL&#93;&quot; is not allowed. Erro&#58; Could not read mappings from resource&#58; Usuario.hbm.xml

Alguma dica?!

Valeu![/code]

Coloque o arquivo Usuario.hbm.xml aqui para darmos uma olhada.

Resolvi… mas agora surgiu outro problema…

Na verdade, eu consigo adicionar um dado qualquer à minha tabela…

Agora preciso saber como proceder para realizar uma consulta dentro dela… e mostrar ela na tela…

To trabalhando diretamente em java. Não tô usando JSP, JSF, nada… to fazendo ensaios pra aprender a utilizar este framework… mas vamos ao problema… tenho os seguintes arquivos em um mesmo diretório (por enquanto, até aprender) hehehe:

-hibernate.properties
-UsuarioDAO.java (este eu não renomeei, por preguiça… mas ele se refere à CorrespUsr)
-CorrespUsr.java
-Teste.java

Aí vão os códigos de cada um:
UsuarioDAO

[code]import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.hibernate.criterion.Restrictions;

public class UsuarioDAO{

private SessionFactory factory;
private Session session;

public UsuarioDAO&#40;&#41; throws Exception&#123;
	factory = new Configuration&#40;&#41;.addClass&#40;CorrespUsr.class&#41;.buildSessionFactory&#40;&#41;;

&#125;     

public void UsInserir&#40;CorrespUsr us&#41; throws Exception &#123;
	Session session = factory.openSession&#40;&#41;;
	Transaction tx = null;
	tx = session.beginTransaction&#40;&#41;;
	session.save&#40;us&#41;;
	tx.commit&#40;&#41;;  
	session.flush&#40;&#41;;
	session.close&#40;&#41;;
&#125;

public void UsAlterar&#40;CorrespUsr us&#41; throws Exception &#123;
	Session session = factory.openSession&#40;&#41;;
	session.update&#40;us&#41;;
	session.flush&#40;&#41;;
	session.close&#40;&#41;;
&#125;
public void UsExcluir&#40;CorrespUsr us&#41; throws Exception &#123;
	Session session = factory.openSession&#40;&#41;;
	session.delete&#40;us&#41;;
	session.flush&#40;&#41;;
	session.close&#40;&#41;;
&#125;

}[/code]

CorrespUsr:

[code]import java.io.Serializable;
/import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
/

/** @author Hibernate CodeGenerator */
public class CorrespUsr implements Serializable {

/** identifier field */
private long usuario;

/** nullable persistent field */
private String nome;

/** nullable persistent field */
private String setor;

/** nullable persistent field */
private String senha;

/** nullable persistent field */
private int status2;

/** full constructor */


public CorrespUsr&#40;String nome, String setor, String senha, int status2&#41; &#123;
    this.setNome&#40;nome&#41;;
    this.setSetor&#40;setor&#41;;
    this.setSenha&#40;senha&#41;;
    this.setStatus2&#40;status2&#41;;
&#125;

/** default constructor */
public CorrespUsr&#40;&#41; &#123;
&#125;

public long getUsuario&#40;&#41; &#123;
    return this.usuario;
&#125;

public void setUsuario&#40;long usuario&#41; &#123;
    this.usuario = usuario;
&#125;

public java.lang.String getNome&#40;&#41; &#123;
    return this.nome;
&#125;

public void setNome&#40;java.lang.String nome&#41; &#123;
    this.nome = nome;
&#125;

public java.lang.String getSetor&#40;&#41; &#123;
    return this.setor;
&#125;

public void setSetor&#40;java.lang.String setor&#41; &#123;
    this.setor = setor;
&#125; 

public java.lang.String getSenha&#40;&#41; &#123;
    return this.senha;
&#125;

public void setSenha&#40;java.lang.String senha&#41; &#123;
    this.senha = senha;
&#125;

public int getStatus2&#40;&#41; &#123;
    return this.status2;
&#125;

public void setStatus2&#40;int status2&#41; &#123;
    this.status2 = status2;
&#125;

/*
public String toString() {
return new ToStringBuilder(this)
.append("usuario", getUsuario())
.toString();
}

public boolean equals&#40;Object other&#41; &#123;
    if &#40; !&#40;other instanceof CorrespUsr&#41; &#41; return false;
    CorrespUsr castOther = &#40;CorrespUsr&#41; other;
    return new EqualsBuilder&#40;&#41;
        .append&#40;this.getUsuario&#40;&#41;, castOther.getUsuario&#40;&#41;&#41;
        .isEquals&#40;&#41;;
&#125;

public int hashCode&#40;&#41; &#123;
    return new HashCodeBuilder&#40;&#41;
        .append&#40;getUsuario&#40;&#41;&#41;
        .toHashCode&#40;&#41;;
&#125;

*/
}
[/code]

O teste java, eu tinha ele setado pra cadastrar um valor no banco, mas quero que ele liste os itens que a tabela possui…

ajudas?!

Brigadão aí povo…

:grin:

Gostaria de ver um exemplo desses com um update ao invés de save.
E se tivesse uma condição, onde ficaria ela?