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

Este é o segundo 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 DAO (Data Access Object) que é responsável por isolar a camada superior do acesso aos dados. Na maioria dos casos teremos uma classe DAO para cada classe do domínio do sistema. Na classe DAO estão os métodos fundamentais para persistência e na classe PessoaDAO temos os métodos específicos de manipulação de dados referente à classe Pessoa mais os métodos da classe DAO que são obtidos por herança.

Estrutura do projeto

estrutura

Códigos

DAO.java:

package br.com.serjaum.dao;

import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.Session;

public class DAO {
    private static Logger logger = Logger.getLogger(DAO.class);
    private Class persistentClass;
    protected Session session;

    public DAO(Session session, Class persistentClass) {
        this.session = session;
        this.persistentClass = persistentClass;
    }

    @SuppressWarnings("unchecked")
    public T load(Long id) {
        logger.info("lendo " + persistentClass + " com id " + id);
        return (T) session.load(persistentClass, id);
    }

     public void save(T t) {
        logger.info("salvando  " + t);
        session.save(t);
    }

    public void delete(T t) {
	logger.info("Deletando " + t);
	session.delete(t);
    }

    @SuppressWarnings("unchecked")
        public List list() {
	logger.info("Listando todos");
    	return session.createCriteria(persistentClass).list();
    }

    public void merge(T t) {
        logger.info("Salvando ou atualizando " + t);
        session.merge(t);
    }
}


PessoaDAO.java

package br.com.serjaum.dao;

import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

import br.com.serjaum.modelo.Pessoa;

public class PessoaDAO extends DAO<Pessoa>{

	private Logger logger = Logger.getLogger(PessoaDAO.class);

	public PessoaDAO(Session session, Class<?> classe) {
		super(session, classe);
	}

	public Pessoa pesquisaPessoaById(Long idPessoa) {
		logger.info("pesquisaPessoaById : " + idPessoa);
		return (Pessoa) session.load(Pessoa.class, idPessoa);
	}

	public String pesquisaPessoaByNome(String nome) {
		logger.info("pesquisaPessoaByNome : " + nome);
		Criteria c = session.createCriteria(Pessoa.class);
		c.add(Restrictions.ilike("nome", nome + "%"));
		c.addOrder(Order.asc("nome"));

		return (String)c.uniqueResult();
	}

	public Pessoa pesquisaPessoaByEmail(String email) {
		logger.info("pesquisaPessoaByEmail : " + email);
		Criteria c = session.createCriteria(Pessoa.class);
		c.add(Restrictions.ilike("email", email + "%"));

		return (Pessoa)c.uniqueResult();
	}

	public List<String> findByNameSuggest(String busca){
		logger.info("findByNameSuggest : " + busca);
		Criteria c = session.createCriteria(Pessoa.class);
		c.add(Restrictions.ilike("nome", busca + "%"));
		c.addOrder(Order.asc("nome"));
		c.setProjection(Projections.property("nome"));

		return c.list();
	}
}
package br.com.serjaum.dao;import java.util.List;import org.apache.log4j.Logger;

import org.hibernate.Criteria;

import org.hibernate.Session;

import org.hibernate.criterion.Order;

import org.hibernate.criterion.Restrictions;

import br.com.serjaum.entidades.Pessoa;

public class PessoaDAO {

private Session session;

private Logger logger = Logger.getLogger(PessoaDAO.class);

public PessoaDAO(Session session) {

logger.info(“Construtor” + session);

this.session = session;

}

public void insertPessoa(Pessoa pessoa) {

session.saveOrUpdate(pessoa);

}

public void updatePessoa(Pessoa pessoa) {

session.merge(pessoa);

}

public void deletePessoa(Pessoa pessoa) {

session.delete(pessoa);

}

public Pessoa retrievePessoa(Pessoa pessoa) {

return (Pessoa) session.load(Pessoa.class, pessoa.getId());

}

public Pessoa retrievePessoaById(Long idPessoa) {

return (Pessoa) session.load(Pessoa.class, idPessoa);

}

@SuppressWarnings(“unchecked”)

public List<Pessoa> loadAll(){

Criteria c = session.createCriteria(Pessoa.class);

c.addOrder(Order.asc(“nome”));

return c.list();

}

public String retrievePessoaByNome(String nome) {

Criteria c = session.createCriteria(Pessoa.class);

c.add(Restrictions.ilike(“nome”, nome + “%”));

c.addOrder(Order.asc(“nome”));

return (String)c.uniqueResult();

}

public Pessoa retrievePessoaByEmail(String email) {

Criteria c = session.createCriteria(Pessoa.class);

c.add(Restrictions.ilike(“email”, email + “%”));

return (Pessoa)c.uniqueResult();

}

}

HibernateUtil.java

package br.com.serjaum.dao;

import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateUtil {

	private static final Logger logger = Logger.getLogger(HibernateUtil.class);

	private static final SessionFactory sessionFactory;

	private static ThreadLocal<Session> sessions = new ThreadLocal<Session>();

	static {
		sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
	}

	public static Session openSession() {
		if (sessions.get() != null) {
			logger.error("There was a session for this thread already!! ");
			// grave, alguem nao fechou uma sessao ja aberta!
		}
		sessions.set(sessionFactory.openSession());
		return sessions.get();
	}

	public static void closeCurrentSession() {
		sessions.get().close();
		sessions.set(null);
	}

	public static Session currentSession() {
		return sessions.get();
	}
}

hibernate.cfg.xml:

<?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">
<hibernate-configuration>
 <session-factory name="">
  <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  <property name="hibernate.connection.url">jdbc:mysql://localhost/jsf</property>
  <property name="hibernate.connection.username">root</property>
  <property name="hibernate.connection.password">root</property>
  <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
  <property name="hibernate.format_sql">false</property>
  <property name="hibernate.show_sql">false</property>
  <property name="hibernate.hbm2ddl.auto">none</property>
  <property name="hibernate.c3p0.acquire_increment">1</property>
  <property name="hibernate.c3p0.idle_test_period">100</property>
  <property name="hibernate.c3p0.max_size">10</property>
  <property name="hibernate.c3p0.max_statements">0</property>
  <property name="hibernate.c3p0.min_size">5</property>
  <property name="hibernate.c3p0.timeout">100</property>

  <mapping class="br.com.serjaum.modelo.Pessoa"/>

 </session-factory>
</hibernate-configuration>
xxx

PessoaTest.java:

package br.com.serjaum.pessoa.test;

import static org.junit.Assert.*;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import br.com.serjaum.dao.DAO;
import br.com.serjaum.modelo.Pessoa;

public class PessoaTest{
	private static Pessoa PESSOA_TESTE = new Pessoa();

	SessionFactory sf;
	Session session;
	Transaction tx;
	DAO<Pessoa> dao;

	@Before
	public void runBeforeEveryTest(){
		sf = new AnnotationConfiguration().configure().buildSessionFactory();
		session = sf.openSession();
		tx = session.beginTransaction();
		dao = new DAO<Pessoa>(session, Pessoa.class);
	}

	@After
	public void runAfterEveryTest(){
		tx.commit();
		session.close();
	}

	@Test
	public void testCadastra(){
		PESSOA_TESTE.setNome("Sérgio Fantin");
		PESSOA_TESTE.setCpf("123.456.789-10");
		PESSOA_TESTE.setEmail("sergio.lnd.fantin@gmail.com");
		PESSOA_TESTE.setTelefoneCelular("(44) 8888-8888");

		dao.save(PESSOA_TESTE);
	}

	@Test
	public void testProcura() {
		Pessoa buscada; 

		buscada = dao.load(PESSOA_TESTE.getId()); 

		assertEquals(PESSOA_TESTE.getId(), buscada.getId());
		assertEquals(PESSOA_TESTE.getNome(), buscada.getNome());
		assertEquals(PESSOA_TESTE.getEmail(), buscada.getEmail());
		assertEquals(PESSOA_TESTE.getCpf(), buscada.getCpf());
		assertEquals(PESSOA_TESTE.getTelefoneCelular(), buscada.getTelefoneCelular());
		assertEquals(PESSOA_TESTE.getDataNascimento(), buscada.getDataNascimento());
	}

	@Test
	public void testAtualiza(){
		Pessoa buscadoParaAtualizacao;
	    Pessoa buscadoAposAtualizacao;

	    buscadoParaAtualizacao = dao.load(PESSOA_TESTE.getId());
	    buscadoParaAtualizacao.setNome("Nome modificado");
	    buscadoParaAtualizacao.setEmail("email@modificado.com");
	    buscadoParaAtualizacao.setCpf("000.000.000-00");
	    buscadoParaAtualizacao.setTelefoneCelular("(00) 0000-0000");
	    buscadoParaAtualizacao.setDataNascimento(new Date());

	    dao.merge(buscadoParaAtualizacao); 

	    buscadoAposAtualizacao = dao.load(PESSOA_TESTE.getId());
	    assertEquals(buscadoParaAtualizacao.getId(), buscadoAposAtualizacao.getId());
	    assertEquals(buscadoParaAtualizacao.getNome(), buscadoAposAtualizacao.getNome());
	    assertEquals(buscadoParaAtualizacao.getEmail(), buscadoAposAtualizacao.getEmail());
	    assertEquals(buscadoParaAtualizacao.getCpf(), buscadoAposAtualizacao.getCpf());
	    assertEquals(buscadoParaAtualizacao.getTelefoneCelular(), buscadoAposAtualizacao.getTelefoneCelular());
	    assertEquals(buscadoParaAtualizacao.getDataNascimento(), buscadoAposAtualizacao.getDataNascimento());
	}

	@Test
	public void testRemove(){
		Pessoa pessoa = PESSOA_TESTE;
		pessoa.setId(1l);
		dao.delete(pessoa);
	}
}

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.

Executando o projeto

  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;
  3. Para testar a camada DAO execute a classe br.com.serjaum.pessoa.test.PessoaTest.java.

Obs: o test irá executar as 4 operações CRUD. O último teste com a assinatura public void testRemove() removerá os registros gravados/atualizados pelos testes anteriores. Caso não queira remover o registro testado comente o código do método testRemove() antes de executar o teste.

Resultado

teste

Continuarei o próximo post desenvolvendo a camada de visão da aplicação. Até o próximo post!


4 Comentários on “JSF – Tutorial RichFaces + Hibernate + MySQL – CRUD completo (parte 2)”

  1. Gregory disse:

    22:06:32,367 INFO Version:15 – Hibernate Annotations 3.4.0.GA
    22:06:32,403 INFO Environment:543 – Hibernate 3.3.1.GA
    22:06:32,415 INFO Environment:576 – hibernate.properties not found
    22:06:32,421 INFO Environment:709 – Bytecode provider name : javassist
    22:06:32,429 INFO Environment:627 – using JDK 1.4 java.sql.Timestamp handling
    22:06:32,558 INFO Version:14 – Hibernate Commons Annotations 3.1.0.GA
    22:06:32,563 INFO Configuration:1460 – configuring from resource: /hibernate.cfg.xml
    22:06:32,564 INFO Configuration:1437 – Configuration resource: /hibernate.cfg.xml
    22:06:32,752 INFO Configuration:1575 – Configured SessionFactory:
    22:06:32,779 INFO Dialect:175 – Using dialect: org.hibernate.dialect.MySQLInnoDBDialect
    22:06:32,961 INFO AnnotationBinder:419 – Binding entity from annotated class: br.com.serjaum.modelo.Pessoa
    22:06:33,027 INFO EntityBinder:422 – Bind entity br.com.serjaum.modelo.Pessoa on table pessoa
    22:06:33,143 INFO AnnotationConfiguration:369 – Hibernate Validator not found: ignoring
    22:06:33,229 INFO SchemaExport:226 – Running hbm2ddl schema export
    22:06:33,231 INFO SchemaExport:251 – exporting generated schema to database
    22:06:33,235 INFO DriverManagerConnectionProvider:64 – Using Hibernate built-in connection pool (not for production use!)
    22:06:33,236 INFO DriverManagerConnectionProvider:65 – Hibernate connection pool size: 20
    22:06:33,236 INFO DriverManagerConnectionProvider:68 – autocommit mode: false
    22:06:33,246 INFO DriverManagerConnectionProvider:103 – using driver: com.mysql.jdbc.Driver at URL: jdbc:mysql://localhost/jsf
    22:06:33,247 INFO DriverManagerConnectionProvider:109 – connection properties: {user=root, password=****}
    22:06:33,523 ERROR SchemaExport:274 – schema export unsuccessful
    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

    Last packet sent to the server was 0 ms ago.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2103)
    at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:718)
    at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:46)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282)
    at java.sql.DriverManager.getConnection(DriverManager.java:582)
    at java.sql.DriverManager.getConnection(DriverManager.java:154)
    at org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:133)
    at org.hibernate.tool.hbm2ddl.ManagedProviderConnectionHelper.prepare(ManagedProviderConnectionHelper.java:52)
    at org.hibernate.tool.hbm2ddl.SchemaExport.execute(SchemaExport.java:252)
    at org.hibernate.tool.hbm2ddl.SchemaExport.create(SchemaExport.java:211)
    at br.com.serjaum.util.GerarTabelas.main(GerarTabelas.java:13)
    Caused by: java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
    at java.net.Socket.connect(Socket.java:525)
    at java.net.Socket.connect(Socket.java:475)
    at java.net.Socket.(Socket.java:372)
    at java.net.Socket.(Socket.java:215)
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:253)
    at com.mysql.jdbc.MysqlIO.(MysqlIO.java:280)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2026)
    … 16 more

    • serjaumfantin disse:

      Olá Gregory,

      esse erro quer dizer que o servidor não pode receber requisições na porta que você definiu. Vê se você consegue acessar a base de dados usando um cliente SQL como o MySQL Query Browser, MySQL Front, etc. Isso é problema no banco mesmo. Outra coisa que dá pra tentar é atualizar o driver do conector do MySQL.

      Boa sorte!

      • Gregory disse:

        Com o mysql query browser eu consigo acessar normalmente, mas quando tento com a aplicação
        da problema.

        Alguma dica do que eu possa fazer para arrumar isso?

        Obrigado

  2. diego disse:

    irei estudar esse projeto…
    mostra como organizar os arquivos, e seus devidos lugares, o que não sabia onde por principalmente a parte de DAO.
    e ainda integrado com JUnit, mt bom.

    vlw!


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