JSF – Tutorial RichFaces + Hibernate + MySQL – CRUD completo (parte 3)

Este é o terceiro post referente à nossa aplicação JSF completa utilizando RichFaces + Hibernate + MySQL na prática.

Dando continuidade ao desenvolvimento da nossa aplicação, codificarei a camada de Façade que é responsável por abstrair a camada de negócios, que contribuirá para a redução do acoplamento entre as camadas da aplicação. Essa camada tem a função de receber solicitações de operações e repassá-las para os métodos de negócio/persistência que estão em outras camadas, mantendo a arquitetura coerente e aumentando a manutenabilidade da aplicação.

Obs: por se tratar de um tutorial prático, preferi simplificar a aplicação adicionando a camada de Façade de uma maneira simples, por isso fiz o gerenciamento de sessões/transações dentro da classe PessoaFacadeImpl.java. O ideal seria retirar esse código de abertura/fechamento de sessões/transações e colocá-lo em um filtro, por exemplo: Open Session In View. Isso é aplicado quando utilizamos um Servlet Contêiner como o Tomcat ou Jetty, mas se o deploy for feito em um Servidor de Aplicação (JBoss, GlassFish, etc) o gerenciamento fica por conta do mesmo, daí é só alegria (ou não?!).

Estrutura do projeto

facade

Códigos

BaseFacade.java:

package br.com.serjaum.facade;

import java.io.Serializable;
import java.util.List;

public interface BaseFacade<T> extends Serializable {
    public abstract void salva(T t); 

    public abstract void remove(T t);  

    public abstract T procura(Long id);  

    public abstract void atualiza(T t);

    public abstract List<T> lista();
}

PessoaFacade.java:

package br.com.serjaum.facade; 

import java.util.List;
import br.com.serjaum.modelo.Pessoa; 

public interface PessoaFacade extends BaseFacade<Pessoa>{
    public void salva(Pessoa p); 

    public void remove(Pessoa p); 

    public Pessoa procura(Long id); 

    public void atualiza(Pessoa p); 

    public List<Pessoa> pesquisaPessoasByNome(String nome);
}


PessoaFacadeImpl.java:

package br.com.serjaum.facade; 

import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import br.com.serjaum.dao.PessoaDAO;
import br.com.serjaum.modelo.Pessoa; 

public class PessoaFacadeImpl implements PessoaFacade { 

    private static final long serialVersionUID = 1818242808424001885L;
    private PessoaDAO pessoaDAO;
    private SessionFactory sf;
    private Session session;
    private Transaction tx; 

    public void salva(Pessoa p) {
        sf = new AnnotationConfiguration().configure().buildSessionFactory();
        session = sf.openSession();
        tx = session.beginTransaction();
        pessoaDAO = new PessoaDAO(session, Pessoa.class); 

        this.pessoaDAO.save(p); 

        tx.commit();
        session.close();
   } 

   public void atualiza(Pessoa p) {
       sf = new AnnotationConfiguration().configure().buildSessionFactory();
       session = sf.openSession();
       tx = session.beginTransaction();
       pessoaDAO = new PessoaDAO(session, Pessoa.class); 

       this.pessoaDAO.merge(p); 

       tx.commit();
       session.close();
   } 

   public Pessoa procura(Long id) {
       sf = new AnnotationConfiguration().configure().buildSessionFactory();
       session = sf.openSession();
       tx = session.beginTransaction();
       pessoaDAO = new PessoaDAO(session, Pessoa.class); 

       Pessoa p = this.pessoaDAO.load(id); 

       tx.commit();
       session.close(); 

       return p;
   } 

   public void remove(Pessoa p) {
       sf = new AnnotationConfiguration().configure().buildSessionFactory();
       session = sf.openSession();
       tx = session.beginTransaction();
       pessoaDAO = new PessoaDAO(session, Pessoa.class); 

       this.pessoaDAO.delete(p); 

       tx.commit();
       session.close();
  } 

  public List<Pessoa> lista() {
      sf = new AnnotationConfiguration().configure().buildSessionFactory();
      session = sf.openSession();
      tx = session.beginTransaction();
      pessoaDAO = new PessoaDAO(session, Pessoa.class);   

      List<Pessoa> lista = this.pessoaDAO.list(); 

      tx.commit();
      session.close();  

      return lista;
 } 

 public List<Pessoa> pesquisaPessoasByNome(String nome) {
     sf = new AnnotationConfiguration().configure().buildSessionFactory();
     session = sf.openSession();
     tx = session.beginTransaction();
     pessoaDAO = new PessoaDAO(session, Pessoa.class); 

     List<Pessoa> lista = this.pessoaDAO.pesquisaPessoas(nome); 

     tx.commit();
     session.close(); 

     return lista;
 } 

 public Pessoa procuraById(Long id){
     sf = new AnnotationConfiguration().configure().buildSessionFactory();
     session = sf.openSession();
     tx = session.beginTransaction();
     pessoaDAO = new PessoaDAO(session, Pessoa.class); 

     Pessoa p = this.pessoaDAO.pesquisaPessoaById(id); 

     tx.commit();
     session.close(); 

     return p;
 } 

 public Pessoa procuraByNome(String nome){
     sf = new AnnotationConfiguration().configure().buildSessionFactory();
     session = sf.openSession();
     tx = session.beginTransaction();
     pessoaDAO = new PessoaDAO(session, Pessoa.class); 

     Pessoa p = this.pessoaDAO.pesquisaPessoaByNome(nome); 

     tx.commit();
     session.close();   

     return p;
 } 

 public Pessoa procuraByEmail(String email){
     sf = new AnnotationConfiguration().configure().buildSessionFactory();
     session = sf.openSession();
     tx = session.beginTransaction();
     pessoaDAO = new PessoaDAO(session, Pessoa.class);   

     Pessoa p = this.pessoaDAO.pesquisaPessoaByEmail(email); 

     tx.commit();
     session.close(); 

     return p;
 }
}

Importando o projeto

  1. Baixe o projeto atualizado >>aqui<<;
  2. Descompacte o projeto no seu workspace;
  3. No Eclipse vá em: File –> Import –> General – Existing Projects into Workspace –> Next –> Selecione o projeto descompactado no workspace –> Finish.

Criando o banco de dados

  1. Com o MySQL instalado e configurado com usuário: root e senha: root crie um novo schema com o nome de jsf.
  2. Execute a classe br.com.serjaum.util.GerarTabelas.java. Essa classe criará as tabelas que foram mapeadas no arquivo hibernate.cfg.xml, no caso a classe Pessoa terá uma tabela correspondente com o nome de pessoa no nosso banco de dados;

No próximo post eu irei codificar o nosso Managed Bean e os arquivos da camada de visão.

Até o próximo post!


One Comment on “JSF – Tutorial RichFaces + Hibernate + MySQL – CRUD completo (parte 3)”

  1. Tiago Vanderlei disse:

    Boa tarde Sérgio,

    Estou tentando rodar esta aplicacao no netbeans aos poucos,
    porém tenho um problema ao executar a classe PessoaTest.java,

    O seguinte erro é informado:
    Compiling 1 source file to C:\Users\Tiago Vanderlei\Documents\NetBeansProjects\jsfWp\build\test\classes
    compile-test-single:
    Testsuite: br.com.serjaum.pessoa.test.PessoaTest
    log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
    log4j:WARN Please initialize the log4j system properly.
    Tests run: 1, Failures: 0, Errors: 2, Time elapsed: 0,69 sec

    ————- Standard Error —————–
    log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
    log4j:WARN Please initialize the log4j system properly.
    ————- —————- —————
    Testcase: testCadastra(br.com.serjaum.pessoa.test.PessoaTest): Caused an ERROR
    com/mchange/v2/c3p0/DataSources
    java.lang.NoClassDefFoundError: com/mchange/v2/c3p0/DataSources
    at org.hibernate.connection.C3P0ConnectionProvider.configure(C3P0ConnectionProvider.java:154)
    at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124)
    at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:56)
    at org.hibernate.cfg.SettingsFactory.createConnectionProvider(SettingsFactory.java:414)
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62)
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292)
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859)
    at br.com.serjaum.pessoa.test.PessoaTest.runBeforeEveryTest(PessoaTest.java:28)

    Testcase: testCadastra(br.com.serjaum.pessoa.test.PessoaTest): Caused an ERROR
    null
    java.lang.NullPointerException
    at br.com.serjaum.pessoa.test.PessoaTest.runAfterEveryTest(PessoaTest.java:36)

    Test br.com.serjaum.pessoa.test.PessoaTest FAILED
    C:\Users\Tiago Vanderlei\Documents\NetBeansProjects\jsfWp\nbproject\build-impl.xml:861: Some tests failed; see details above.
    FALHA NA CONSTRUÇÃO (tempo total: 10 segundos)

    Desde já agradeço.


Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s