1 - Introdução
Neste artigo mostrarei passo-a-passo como criar um cadastro de usuários usando Java SE console + Hibernate + MySQL + Netbeans. Esta é uma aplicação simples mas que, com certeza, servirá como base para aplicações mais avançadas. Durante os anos de consultor eu percebi que a maior dificuldade dos iniciantes em Hibernate está em fazer a primeira aplicação rodar. A partir do entendimento desta primeira aplicação, a colocação correta dos diversos JARs que compõem o framework e a verificação de que os dados foram inseridos corretamente no banco de dados, os usuários iniciantes já se sentem mais confiantes para progredir.
Infelizmente, a maioria dos livros sobre o assunto dedicam cinco ou mais capítulos somente aos aspectos teóricos do Hibernate Framework e a importância do ORM (Object-Relation Mapping - Mapeamento Objeto-Relacional).
Por esta razão e em resposta a várias solicitações dos visitantes do meu site eu resolvi escrever este pequeno roteiro. Siga-o atentamente e terá sua primeira aplicação Java usando Hibernate em questão de minutos.
2 - Ferramentas Necessárias
Para construir o exemplo você precisará das seguintes ferramentas:
a) Uma instalação funcional do Hibernante - Baixe, instale e teste uma versão recente do Hibernate. Aqui mesmo no meu site você encontrará informações sobre como proceder.
b) O banco de dados MySQL - Baixe, instale e teste uma versão recente do MySQL. Você encontrará esta informação aqui no site também.
c) Netbeans - Certifique-se de estar usando uma versão bem atual do Netbeans.
d) O Java SDK - Para este exemplo nós vamos usar XML para fazer o mapeamento entre a nossa classe e o banco de dados MySQL (um arquivo *.hbm.xml). Por enquanto não usaremos Annotations. Assim, qualquer Java SDK maior que 1.4 servirá.
e) MySQL Connector/J - Este é o driver usado para fazer a ponte JDBC e o banco de dados MySQL. Aqui no meu site você também encontará informações sobre como baixar e instalar este driver.
3 - Preparando o banco de dados
A aplicação que vamos construir é bem simples. Teremos apenas o id, nome, e-mail e senha de um usuário. Assim, crie uma base de dados chamada "estudos" e crie a seguinte tabela MySQL:
Veja que o campo id é do tipo int, auto-incremento e chave primária. Desta forma, o Hibernate deverá saber como incrementar os valores deste campo automaticamente. Hora de passarmos para o Netbeans.
4 - Criando a aplicação no Netbeans
Se você ainda não o fez, abra o Netbeans e crie um novo projeto. Vá em Arquivo -> Novo Projeto -> Java -> Aplicativo Java. Dê o nome "exemplo_hibernate" ao projeto e salve-o no diretório de sua preferência. Em minha máquina eu deixei em "C:\estudos_hibernate'. Clique o botão Finalizar.
Agora vamos criar um POJO (não é xingamento. É Plain Old Java Object). Qualquer classe Java pode ser persistida em um banco de dados por meio do Hibernate. Mais um ponto para ele. Assim, vá em Arquivo -> Novo Arquivo -> Java - Classe Java. Dê o nome "Usuario" para a classe e coloque-a em um pacote chamado "osmar" (Sou o autor do artigo. Mereço esta homenagem). Sua estrutura de arquivo e pacotes deverá agora estar semelhante à figura abaixo:
Agora altere o conteúdo de Usuario.java para:
Código para Usuario.java:
Analise o código desta classe cuidadosamente e vamos passar para o arquivo de mapeamento. Clique com o botão direito em "Pacotes de Códigos Fonte" e escolha Novo -> Documento XML. Dê o nome usuario.hbm.xml e deixe o campo pasta como "src". Agora altere seu conteúdo para:
Conteúdo para usuario.hbm.xml:
Já estamos quase lá. Temos a tabela no banco de dados, a classe Usuario e o arquivo de mapeamento entre a classe e a tabela do banco de dados. Podemos passar agora para o arquivo de configuração do Hibernate. Muita atenção agora.
Clique com o botão direito em "Pacotes de Códigos Fonte" e escolha Novo -> Documento XML. Dê o nome "hibernate.cfg.xml" ao arquivo e deixe o campo pasta como "src". Isso fará com que o arquivo de configuração do Hibernate seja colocado no raiz do projeto. Veja o conteúdo para este arquivo:
Conteúdo para hibernate.cfg.xml:
Até este momento sua estrutura de arquivos e pacotes deverá estar assim:
Vamos passar para a classe principal da aplicação. Antes, clique com o botão direito em Bibliotecas -> Adicionar JAR/Pasta e localize o JAR hibernate3.jar. Marque Caminho Absoluto e clique o botão Open. Faça o mesmo com o driver do banco de dados MySQL (O meu é mysql-connector-java-5.1.10-bin.jar). Em seguida altere o código da classe principal (Main.java) para:
Código para Main.java:
Vamos executar o programa. Aperte a tecla F6 e se prepare para a primeira surpresa:
Essa é fácil. Mova as linhas:
para fora do bloco try:
e execute novamente. Agora temos mais informações sobre o motivo da exceção:
Isso aconteceu porque não importamos os JARs obrigatórios do pacote required do Hibernate. Em minha máquina estes JARs estão em "C:\hibernate\lib\required". Assim, clique com o botão direito em Bibliotecas -> Adicionar JAR/Pasta e importe todos os JARs desta pasta. Execute a aplicação novamente. Se for sortudo, a aplicação será iniciada com sucesso. Para alguns, uma exceção parecida com o conteúdo abaixo será exibida:
Este é um exemplo clássico de diferença da versão de biblioteca exigida pelo Hibernate e aquela disponível ou disponibilizada junto com o download. Para esta simulação, basta substituir o JAR slf4j-api-1.5.8.jar por slf4j-api-1.6.0.jar (disponível para download em Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...).
Outra exceção que você poderá encontrar é:
Isso acontece quando o arquivo de configuração hibernate.cfg.xml não é encontrado. Para solucionar, verifique se o arquivo está realmente na raiz da aplicação, ou seja, sua estrutura de arquivos e diretórios deve ser parecida com:
5 - Conclusão
Se após seguir os passos que detalhei neste artigo você conseguiu executar sua primeira aplicação Java + Hibernate, eu acredito que os passos seguintes serão bem menos doloridos. Como dito no início do texto, a maior dificuldade dos iniciantes em Hibernate é conseguir fazer a primeira aplicação rodar. Se correu tudo bem com você eu fico feliz por ter compartilhado este conhecimento.
Agora é com você! Boa sorte nos estudos.
Neste artigo mostrarei passo-a-passo como criar um cadastro de usuários usando Java SE console + Hibernate + MySQL + Netbeans. Esta é uma aplicação simples mas que, com certeza, servirá como base para aplicações mais avançadas. Durante os anos de consultor eu percebi que a maior dificuldade dos iniciantes em Hibernate está em fazer a primeira aplicação rodar. A partir do entendimento desta primeira aplicação, a colocação correta dos diversos JARs que compõem o framework e a verificação de que os dados foram inseridos corretamente no banco de dados, os usuários iniciantes já se sentem mais confiantes para progredir.
Infelizmente, a maioria dos livros sobre o assunto dedicam cinco ou mais capítulos somente aos aspectos teóricos do Hibernate Framework e a importância do ORM (Object-Relation Mapping - Mapeamento Objeto-Relacional).
Por esta razão e em resposta a várias solicitações dos visitantes do meu site eu resolvi escrever este pequeno roteiro. Siga-o atentamente e terá sua primeira aplicação Java usando Hibernate em questão de minutos.
2 - Ferramentas Necessárias
Para construir o exemplo você precisará das seguintes ferramentas:
a) Uma instalação funcional do Hibernante - Baixe, instale e teste uma versão recente do Hibernate. Aqui mesmo no meu site você encontrará informações sobre como proceder.
b) O banco de dados MySQL - Baixe, instale e teste uma versão recente do MySQL. Você encontrará esta informação aqui no site também.
c) Netbeans - Certifique-se de estar usando uma versão bem atual do Netbeans.
d) O Java SDK - Para este exemplo nós vamos usar XML para fazer o mapeamento entre a nossa classe e o banco de dados MySQL (um arquivo *.hbm.xml). Por enquanto não usaremos Annotations. Assim, qualquer Java SDK maior que 1.4 servirá.
e) MySQL Connector/J - Este é o driver usado para fazer a ponte JDBC e o banco de dados MySQL. Aqui no meu site você também encontará informações sobre como baixar e instalar este driver.
3 - Preparando o banco de dados
A aplicação que vamos construir é bem simples. Teremos apenas o id, nome, e-mail e senha de um usuário. Assim, crie uma base de dados chamada "estudos" e crie a seguinte tabela MySQL:
Código PHP:
CREATE TABLE estudos.usuarios (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
nome VARCHAR(45) NOT NULL,
email VARCHAR(45) NOT NULL,
senha VARCHAR(10) NOT NULL,
PRIMARY KEY (id)
)
ENGINE = InnoDB;
4 - Criando a aplicação no Netbeans
Se você ainda não o fez, abra o Netbeans e crie um novo projeto. Vá em Arquivo -> Novo Projeto -> Java -> Aplicativo Java. Dê o nome "exemplo_hibernate" ao projeto e salve-o no diretório de sua preferência. Em minha máquina eu deixei em "C:\estudos_hibernate'. Clique o botão Finalizar.
Agora vamos criar um POJO (não é xingamento. É Plain Old Java Object). Qualquer classe Java pode ser persistida em um banco de dados por meio do Hibernate. Mais um ponto para ele. Assim, vá em Arquivo -> Novo Arquivo -> Java - Classe Java. Dê o nome "Usuario" para a classe e coloque-a em um pacote chamado "osmar" (Sou o autor do artigo. Mereço esta homenagem). Sua estrutura de arquivo e pacotes deverá agora estar semelhante à figura abaixo:
Agora altere o conteúdo de Usuario.java para:
Código para Usuario.java:
Código PHP:
package osmar;
public class Usuario{
private int id;
private String nome;
private String email;
private String senha;
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 String getSenha(){
return senha;
}
public void setSenha(String senha){
this.senha = senha;
}
}
Conteúdo para usuario.hbm.xml:
Código PHP:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="osmar.Usuario" table="usuarios">
<id name="id" type="int" column="id">
<generator class="increment"/>
</id>
<property name="nome">
<column name="nome"/>
</property>
<property name="email">
<column name="email"/>
</property>
<property name="senha">
<column name="senha"/>
</property>
</class>
</hibernate-mapping>
Clique com o botão direito em "Pacotes de Códigos Fonte" e escolha Novo -> Documento XML. Dê o nome "hibernate.cfg.xml" ao arquivo e deixe o campo pasta como "src". Isso fará com que o arquivo de configuração do Hibernate seja colocado no raiz do projeto. Veja o conteúdo para este arquivo:
Conteúdo para hibernate.cfg.xml:
Código PHP:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">
jdbc:mysql://localhost/estudos</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.connection.pool_size">10</property>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- Arquivos de Mapeamento -->
<mapping resource="usuario.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Vamos passar para a classe principal da aplicação. Antes, clique com o botão direito em Bibliotecas -> Adicionar JAR/Pasta e localize o JAR hibernate3.jar. Marque Caminho Absoluto e clique o botão Open. Faça o mesmo com o driver do banco de dados MySQL (O meu é mysql-connector-java-5.1.10-bin.jar). Em seguida altere o código da classe principal (Main.java) para:
Código para Main.java:
Código PHP:
package exemplo_hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import osmar.Usuario;
public class Main {
public static void main(String[] args) {
Session session = null;
try {
// aqui nós lemos as configurações do arquivo hibernate.cfg.xml
// e deixamos o Hibernate pronto para trabalhar
SessionFactory sessionFactory = new
Configuration().configure().buildSessionFactory();
session = sessionFactory.openSession();
// vamos criar uma nova instância da classe Usuario
// e definir valores para seus atributos
// note que não precisamos atribuir valores para
// o atributo id
System.out.println("Vou gravar um novo usuário");
Usuario u = new Usuario();
u.setNome("Osmar J. Silva");
u.setEmail("osmar@arquivodecodigos.net");
u.setSenha("1234");
Transaction tx = session.beginTransaction();
session.save(u); // vamos salvar o usuário
session.flush();
tx.commit();
System.out.println("Finalizei. Veja a tabela usuarios");
}
catch(Exception e){
System.out.println(e.getMessage());
}
finally{
session.close();
}
}
}
Exception in thread "main" java.lang.NullPointerException
at exemplo_hibernate.Main.main(Main.java:40)
at exemplo_hibernate.Main.main(Main.java:40)
Código PHP:
SessionFactory sessionFactory =
new Configuration().configure().buildSessionFactory();
session = sessionFactory.openSession();
Código PHP:
SessionFactory sessionFactory =
new Configuration().configure().buildSessionFactory();
session = sessionFactory.openSession();
try {
Exception in thread "main" java.lang.NoClassDefFoundError: org/dom4j/DocumentException
at exemplo_hibernate.Main.main(Main.java:14)
Caused by: java.lang.ClassNotFoundException: org.dom4j.DocumentException
at java.net.URLClassLoader$1.run(URLClassLoader.java: 200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.j ava:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:3 07)
at sun.misc.Launcher$AppClassLoader.loadClass(Launche r.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:2 52)
at java.lang.ClassLoader.loadClassInternal(ClassLoade r.java:320)
... 1 more
at exemplo_hibernate.Main.main(Main.java:14)
Caused by: java.lang.ClassNotFoundException: org.dom4j.DocumentException
at java.net.URLClassLoader$1.run(URLClassLoader.java: 200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.j ava:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:3 07)
at sun.misc.Launcher$AppClassLoader.loadClass(Launche r.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:2 52)
at java.lang.ClassLoader.loadClassInternal(ClassLoade r.java:320)
... 1 more
SLF4J: The requested version 1.6 by your slf4j binding is not compatible with [1.5.5, 1.5.6, 1.5.7, 1.5.8]
SLF4J: See Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... for further details.
org.hibernate.cfg.Environment <clinit>
INFO: Hibernate 3.5.1-Final
org.hibernate.cfg.Environment <clinit>
INFO: hibernate.properties not found
org.hibernate.cfg.Environment buildBytecodeProvider
INFO: Bytecode provider name : javassist
org.hibernate.cfg.Environment <clinit>
INFO: using JDK 1.4 java.sql.Timestamp handling
org.hibernate.cfg.Configuration configure
INFO: configuring from resource: /hibernate.cfg.xml
org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: Configuration resource: /hibernate.cfg.xml
Exception in thread "main" org.hibernate.HibernateException: /hibernate.cfg.xml not found
at org.hibernate.util.ConfigHelper.getResourceAsStrea m(ConfigHelper.java:170)
at org.hibernate.cfg.Configuration.getConfigurationIn putStream(Configuration.java:1497)
at org.hibernate.cfg.Configuration.configure(Configur ation.java:1519)
at org.hibernate.cfg.Configuration.configure(Configur ation.java:1506)
at exemplo_hibernate.Main.main(Main.java:14)
SLF4J: See Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... for further details.
org.hibernate.cfg.Environment <clinit>
INFO: Hibernate 3.5.1-Final
org.hibernate.cfg.Environment <clinit>
INFO: hibernate.properties not found
org.hibernate.cfg.Environment buildBytecodeProvider
INFO: Bytecode provider name : javassist
org.hibernate.cfg.Environment <clinit>
INFO: using JDK 1.4 java.sql.Timestamp handling
org.hibernate.cfg.Configuration configure
INFO: configuring from resource: /hibernate.cfg.xml
org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: Configuration resource: /hibernate.cfg.xml
Exception in thread "main" org.hibernate.HibernateException: /hibernate.cfg.xml not found
at org.hibernate.util.ConfigHelper.getResourceAsStrea m(ConfigHelper.java:170)
at org.hibernate.cfg.Configuration.getConfigurationIn putStream(Configuration.java:1497)
at org.hibernate.cfg.Configuration.configure(Configur ation.java:1519)
at org.hibernate.cfg.Configuration.configure(Configur ation.java:1506)
at exemplo_hibernate.Main.main(Main.java:14)
Outra exceção que você poderá encontrar é:
org.hibernate.cfg.Environment <clinit>
INFO: Hibernate 3.5.1-Final
org.hibernate.cfg.Environment <clinit>
INFO: hibernate.properties not found
org.hibernate.cfg.Environment buildBytecodeProvider
INFO: Bytecode provider name : javassist
org.hibernate.cfg.Environment <clinit>
INFO: using JDK 1.4 java.sql.Timestamp handling
org.hibernate.cfg.Configuration configure
INFO: configuring from resource: /hibernate.cfg.xml
org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: Configuration resource: /hibernate.cfg.xml
Exception in thread "main" org.hibernate.HibernateException: /hibernate.cfg.xml not found
at org.hibernate.util.ConfigHelper.getResourceAsStrea m(ConfigHelper.java:170)
at org.hibernate.cfg.Configuration.getConfigurationIn putStream(Configuration.java:1497)
at org.hibernate.cfg.Configuration.configure(Configur ation.java:1519)
at org.hibernate.cfg.Configuration.configure(Configur ation.java:1506)
at exemplo_hibernate.Main.main(Main.java:14)
INFO: Hibernate 3.5.1-Final
org.hibernate.cfg.Environment <clinit>
INFO: hibernate.properties not found
org.hibernate.cfg.Environment buildBytecodeProvider
INFO: Bytecode provider name : javassist
org.hibernate.cfg.Environment <clinit>
INFO: using JDK 1.4 java.sql.Timestamp handling
org.hibernate.cfg.Configuration configure
INFO: configuring from resource: /hibernate.cfg.xml
org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: Configuration resource: /hibernate.cfg.xml
Exception in thread "main" org.hibernate.HibernateException: /hibernate.cfg.xml not found
at org.hibernate.util.ConfigHelper.getResourceAsStrea m(ConfigHelper.java:170)
at org.hibernate.cfg.Configuration.getConfigurationIn putStream(Configuration.java:1497)
at org.hibernate.cfg.Configuration.configure(Configur ation.java:1519)
at org.hibernate.cfg.Configuration.configure(Configur ation.java:1506)
at exemplo_hibernate.Main.main(Main.java:14)
5 - Conclusão
Se após seguir os passos que detalhei neste artigo você conseguiu executar sua primeira aplicação Java + Hibernate, eu acredito que os passos seguintes serão bem menos doloridos. Como dito no início do texto, a maior dificuldade dos iniciantes em Hibernate é conseguir fazer a primeira aplicação rodar. Se correu tudo bem com você eu fico feliz por ter compartilhado este conhecimento.
Agora é com você! Boa sorte nos estudos.