JSF + Hibernate + MySql no Eclipse

stressprogrammer

opa!Pessoal!! Cansado de fazer um CRUD manualmente usando o padrão DAO? É porque você precisa conhecer o Hibernate.
No post de hoje vamos criar uma persistencia de dados usando framework Hibernate no Eclipse tendo o framework JSF como view. Vejam que não é tão complicado assim, o chato é configurar o hibernate no Eclipse, ao contrário do NetBeans que ja traz tudo pre-configurado e não precisa fazer muita coisa para Hibernate funcionar. Mas, como todos nos sabemos que bons programadores,desenvolvedores, etc. não ficam refém das pre-configurações de uma IDE. E isso é uma vantagem do velho e famoso Eclipse, por não contribuir para esse fim, ou seja, você usa o Eclipse por gostar dele e nao por ele fazer as coisas por você ;).
Lets go…

Sobre Aplicação

Bem, a ideia aqui é apresentar a vantagem de usar o framework Hibernate para persistência de dados, entao vamos fazer uma aplicação bem simples e ficaremos mais focado na parte do Hibernate. A nossa aplicação tem a função de gravar o nome de um visitante em um base de dados(MySQL).

Sobre o Hibernate – para não duplicar o que ja tem na net, lá vai a “reutilização da informação” 😉 O que é hibernate?

Download Hibernate – ponto importante, nesse final de semana fiquei tentando colocar a ultima versão do hibernate para funcionar porem nao tive sucesso, com a ultima versão, veio faltando uns .jars e até agora não descobrir o motivo, estou pesquisando e verificando se não é um problema local na hora de descompactar o pacote. Em função disso usei uma versão mais antiga a 3.2.1.ga e no link acima disponibilizei apenas os .jars do hibernate da versao que está sendo utilizado nesse post.

Download Hibernate versão 3.3.2.GA – essa eh a ultima versão que consta no site Hibernate.org neste momento que escrevo o post. Porém, nao estamos usando ela.

Requisitos:
Eclipse Galileo (versão em uso para este post)
JDK 1.5
Hibernate 3.2.1 (versão em uso para este post)
Jboos tools no Eclipse
MySql (vamos considerar que criou o DataBase e Table no BD)
TomCat 5.5/Superior

Alguns problemas:
Para adiantar, identifiquei alguns “problemas” que podem tirar você do sério. Quando você cria um Library no Eclipse e add este ao seu projeto, os arquivos .jars não vão para a pasta lib. E se vc tentar adicionar .jars diretamente ao projeto este também não vai parar no diretorio lib do projeto. Não sei porque o Eclipse não faz isso, desde do dynamic web project há este problema. Em função disso é necessário copiar os .jars do Hibernate para a pasta lib do seu projeto. Abaixo uma imagem dos .jars necessário para que o hibernate funcione. Não esqueça do arquivo .jar do MySql na pasta lib do projeto.

Iniciando

1.crie um projeto JSF PROJECT
2.Agora crie uma página index.jsp com o código a seguir

3.crie uma pagina sucesso.jsp com o código abaixo.

< f:view>

< h:outputText value=“Visitante, cadastrado com sucesso!”/>

< /f:view>

4.Crie uma estrutura conforme abaixo no seu projeto. A seguir vamos apresentar os codes de cada classe, não se preocupe.

5.Agora vamos criar os arquivos de configuração e conexao com o BD via Hibernate. Para isso crie dois arquivos no formato .xml (hibernate.cfg.xml e visitantes.hbm.xml), estes devem estrar dentro de Source. Sua estrutura deve estar conforme abaixo:

Pronto, terminamos a configuração do ambiente de desenvolvimento, agora vamos a parte mais interessante.

Desenvolvimento
1.precisamos criar um Bean para nossa aplicação, então abra o arquivo Visitante.java e deixe conforme o code a seguir:

public class Visitante {
private String nome;
private int id;
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;}}

2.Agora vamos criar o controlador JSF para isso abra o arquivo VisitanteControler.java e deixe conforme o code abaixo:

import br.com.bean.Visitante;
import br.com.dao.InterfaceDAO;
import br.com.dao.VisitanteDAO;
//classe controladora JSF
public class VisitanteControler {
private Visitante visitante;
public VisitanteControler() {
visitante  = new Visitante();	}
public Visitante getVisitante() {
return visitante;	}
public void setVisitante(Visitante visitante) {
this.visitante = visitante;}
public String salvar(){
InterfaceDAO visitantedao = new VisitanteDAO();
visitantedao.salvar(visitante);
return "salvar";}}

3.O objetivo agora é configurar e fazer o mapeamento com Hibernate. Para isso atualize o arquivo hibernate.cfg.xml conforme o codigo a seguir:

    <?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” >

<!– CONFIGURANDO O HIbernate –>

<hibernate-configuration>

<session-factory>

<property name=“hibernate.connection.driver_class”>org.gjt.mm.mysql.Driver</property>

<property name=“hibernate.connection.url”>jdbc:mysql://localhost/livraria</property>

<property name=“hibernate.connection.username”>camilo</property>

<property name=“hibernate.connection.password”>integrator</property>

<!– USADO PELO HIBERNATE PARA SE COMUNICAR COM O BD –>

<property name=“hibernate.dialect”>org.hibernate.dialect.MySQLDialect</property>

<mapping resource=“visitantes.hbm.xml”/> <!– pega a tabela –>

</session-factory>

</hibernate-configuration>

 

4.Agora atualize o arquivo visitantes.hbm.xml

< hibernate-mapping>

<!– INFORMANDO O LOCAL DO BEAN E O NOME DA TABELA NO BD –>

<class name=“br.com.bean.Visitante” table=“visitante”>

<!– CHAVE PRIMARIA DA TABELA –>

<id column=“id” name=“id” type=“integer”>

<generator class=“assigned”/>

</id>

<property column=“nome” name=“nome” type=“string”/>

</class>

</hibernate-mapping>

5.Abra o arquivo ConexaoHi.java e insira os codigos a seguir:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
//classe que conecta ao Hibernate
public class ConexaoHi {
//variavel que armazena os mapeamentos e configuracoes do Hibernate
private static final SessionFactory sessionFactory;
private static final ThreadLocal threadlocal = new ThreadLocal();
static{
try{
sessionFactory = new Configuration()
.configure("hibernate.cfg.xml")
.buildSessionFactory();
/*recebemos a configuracao do arquivo hibernate.cfg.xml que possui
*dados da conexao
* chamamos o metodo buildSessionFactory que retorna um objeto
* session, que estabelece uma sessao de comunicacao com o BD
* atraves de uma conexao JDBC */
}catch (Throwable e) {
throw new ExceptionInInitializerError(e);}
}
/* esse metodo associada cada sessao a um objeto, permitindo que
 * cada sessao abra um processo concorrente  */
public static Session getInstance(){
Session session = (Session) threadlocal.get();
session = sessionFactory.openSession();
threadlocal.set(session);
return session;}}

6.Atualize o arquivo VisitanteDAO.java

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import br.com.bean.Visitante;
import br.com.util.ConexaoHi;
//com hibernate
public class VisitanteDAO implements InterfaceDAO {
private Session session;
//metodo responsavel por salvar os dados no BD
public void salvar(Visitante visitante){
session = ConexaoHi.getInstance();//cria uma sessao
Transaction tx = null; //permite transacoes no BD
try{
tx = session.beginTransaction();
session.save(visitante);//grava no BD
tx.commit();//transacao efetuada
}catch (HibernateException e) {
System.out.println("deu merda aqui");
e.printStackTrace();
//tem o objetivo de desfazer a transcao em caso de erro
tx.rollback();
}finally{
session.close();}}}

7.Seu arquivo InterfaceDAO.java deve estar assim:

import br.com.bean.Visitante;
public interface InterfaceDAO {
public abstract void salvar(Visitante visitante);
}

8.Não podemos esquecer de configurar o arquivo faces-config.xml, para isso deixe conforme o code a seguir :

  visitanteControler
  br.com.controller.VisitanteControler
  session

  /form.jsp

   salvar
   /sucesso.jsp

9.Agora atualize os arquivos .jsp, começando pelo form.jsp

Pronto, terminamos o desenvolvimento, chegou a hora de testar…

Testando
1.para testar aplicação clique com o botão direto em cima do projeto e escolha Run As – Run on Server.
2.Aguarde o browser interno do eclipse seja carregado (por padrão será ele). E você verá a seguinte tela:

3.Cadastre um visitante


4.Verificando visitante no BD


Vou ficando por aqui e espero que vocês tenham gostado do post. Um pouco grande, porem bastante produtivo. Vejam a essencia e as vantagens de usar um framework como Hibernate para persistência de dados.
Abracos e até o proximo post…

24 comentários em “JSF + Hibernate + MySql no Eclipse”

  1. Olá Camilo. Muito bom seu tutorial. Vc tem os arquivos JSP e os JSF para mim ver como ficou? Abraços e Obrigado

    1. olá renato,
      vou dar uma procurada hehehe, espero que sim, me envia um email cobrando que eu olho. :).
      abracos,

  2. Olá Camilo, muito bom seu exemplo, ajudou muito em meus estudos. Só tenho uma dúvida. Caso tenha uma table na pagina exibindo os dados do cadastro, após SALVAR ao inves de ir para /sucesso.jsp como faço para dar um refresh na página e mostrar o novo registro inserido? Estou utilizado JSF+Hibernate+MySQL.
    Obrigado Amigo.

    1. olá renato,
      obrigado pelo feedback. ao inves de você mandar para a pagina de sucesso envia direto para a pagina de exibir. e se for na mesma pagina vc dar uma pesquisa sobre o uso de templates jsf facelets que vc vai ver como implementar, aqui no blog nao postei nada ainda a respeito.
      abracos! e bons códigos.

  3. Ola Camilo, gostei do post!

    Gostaria de tirar algumas duvidas.

    Como faria para deixar o open, commit e rollback automatico todas as vezes que chamar o metodo do hibernate?

    Vi que para mapear as tabelas, foram usadas xml, mas usando annotarion, da no mesmo? Pois prefiro fazer com annotation do que xml`s.

    Valeu ai!

    1. opa tiago,
      acho que em alguns posts meus de hibernate vc vai encontrar a solucao para o que precisa referente ao deixar os metodos do hibernate “automatico”, no momento eu nao tenho nada para ti passar pq nao estou no brasil e nao trouxe meu laptop que uso para TI. hehe.
      A respeito do mapeamento, isso varia muito um programador que usa o hibernate como persistencia ele precisa saber tanto fazer o mapeamento com xml quanto usar annotations, concerteza, usar annotations é bem melhor e facilita o desenvolvimento e manutencao, mas lembre-se usar annotations requer java 5 e nem toda aplicacao usa java 5, dai vc terá que dominar o mapeamento, boa parte das vagas que tem disponveis e pedem hibernate, é para sistema legado, entao estar preparado para as duas situacoes é o melhor que vc deveria fazer.
      abracos,

  4. Terrível.
    Os códigos das jsps estão pela metade:
    “9.Agora atualize os arquivos .jsp, começando pelo form.jsp

    ;

    Pronto, terminamos o desenvolvimento, chegou a hora de testar…”

    Não é possível terminar o tutorial.

    1. esse é o problema do usar plugin para formatar codigos, sao horriveis, do nada eles nao identificam o codigo, e mexe no codigo, achando que eh html. aff odeios eles, vou parar de usar para codigos em jsp. so fazem stressar.
      valeu pelo feedback.
      Por falta de sorte sua, qdo foi ler o plugin ja tinha comido o código. Vou atualizar qdo retornar ao brasil, estou sem o codigo fonte aqui.

  5. Opa camilo

    Tentei usar seu exemplo, e obtive muitos erros por conta dos codigos que estao faltando
    estou começando em jsf.

    Você poderia atualizar este post ou me mandar os fontes?

    Desde já agradeço

  6. Oi. Eu trabalho com tecnologia Microsoft há 4 anos e estou aprendendo JSF + Hibernate com Eclipse no Linux, e devo admitir que a curva de aprendizagem está tipo um penhasco, tá difícil, só para configurar o ambiente de desenvolvimento (tomcat, oracle jdk, eclipse, libraries) quase arranquei os cabelos. No meu projeto tenho o diretório /src com os packages model, dao, controller, xmls de configuração do hibernate. Aí tenho WebContent com diretorios META-INF e WEB-INF. Onde eu coloco as paginas html/jsp/xhtml/jsf ? E o faces.config.xml (tá certo o que está no artigo?) Também, onde eu digo que estou usando JSF? Não deveria ter um import javax.faces em algum lugar? Valeu cara!

    1. olá Rafael,

      Realmente para quem vem de outras tecnologias sente bastante dificuldade no inicio e para começar com configuração, foi assim comigo. Tecnologias Microsoft é mais simples esse ponto.Antes de mais nada você precisa entender como é a estrutura JEE, independente do framework que você for usar a especificação JEE deve ser seguida por esses frameworks. Então, todo arquivo xhtml, jsp deve ficar dentro webapps/WebContent (depende do modelo do seu projeto). No web-inf colocamos aquilo que o usuário não pode acessar diretamente pelo browser. Aqui vc coloca .jsp, .xhtml tb, mas esses caras não são acessados diretamente. O faces-config.xml ele fica dentro de web-inf. Se vc usar o plugin jboss tools no Eclipse e criar um jsf project, terá todo o projeto correto. O faces-config a partir da versão 2.0 do JSF tem se utilizando com menor frequencia, mas ainda há cenários que ele é mais produtivo que usar annotations ou navegação implicita do JSF 2.0. Você vai dizer que está usando JSF no web.xml e adicionar as bibliotecas na pasta lib do seu projeto.
      No meu livro JEE com frameworks eu mostro como brincar no mundo JEE. Porém, lá é o JSF 1.2.

      abracos

  7. Olá..
    Poxa cara gostei muito do tema que você usa no seu Eclipse tem como você pode disponibiliza.

    1. olá Everson,
      Não é do eclipse, foi um plugin que instalei no blog para formatar códigos. E estou migrando aos poucos.
      vlw.

  8. Olá, estou começando a desenvolver em java e no momento estou usando o eclipse. Adorei post, me ajudou muito.. Mas tive dificuldade ao adicionar os .jars porque o eclipse que me passaram já tem esses .jars.. mas quando tento rodar não executa. Você pode me ajudar?

    1. olá Mayara,

      Qual eclipse vc está usando? Dificilmente o Eclipse já vem com .jars de frameworks como Hibernate, JSF etc.

  9. Olá Camilo, obrigada por me responder.. Mas já consegui adicionar os jars rs Agora meu problema é com a conexão, alguns projetos eu consigo, outros não. Você teria um exemplo básico de conexão hibernate, jdbc?

Deixe um comentário para Mayara Cancelar resposta

O seu endereço de e-mail não será publicado.