Classe para persistencia geral

Java

28/04/2011

Achei que essa classe resolveria meu problema, mas será que resolveria mesmo? Gostaria de estar no Form Escola e gravar,deletar,atualizar e listar somente escola. Se tiver no Form professor, idem para professior. Abaixo minha Interface e minha classe DaoImplementaTudo.
package br.com.prime.dao;

import java.util.List;
import br.com.prime.modelo.*;

public interface DAO<T> {
    public void Inserir(T t);
    public void Deletar(T t);
    public void Atualizar(T t);
    public List<T> lista();
}


import br.com.prime.dao.*;
import br.com.prime.modelo.*;
import br.com.prime.util.*;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class EscolaDao implements DAO{
    
    @Override
    public void Deletar(Object obj) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction t = session.beginTransaction();
        session.delete(obj);
        t.commit();        
    }
    @Override
    public void Atualizar(Object obj) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction t = session.beginTransaction();
        session.update(obj);
        t.commit();        
    }
    @Override
    public void Inserir(Object obj) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction t = session.beginTransaction();
        session.save(obj);
        t.commit();
        
    }
    @Override
    public List lista() {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction t = session.beginTransaction();
        List lista = session.createQuery("from Escola").list();
        t.commit();
        return lista;
    }
}

Pjava

Pjava

Curtidas 0

Respostas

Davi Costa

Davi Costa

28/04/2011

cara, já deu uma caminhada, mas pode melhorar.

Da forma que está vc vai criar EscolaDAO, AlunoDAO e terá que sempre implementar os métodos genéricos do crud.

leia atentamente aquele help que te dei sobre generics, em uma outra thread, que eu explico uma forma de passarmos Entity para o DAOGenerico (implementação da interface genérica) que já temos todos os métodos de crud completos. Daí bastaria vc colocar:

public class EscolaDao implements DAO<Escola>{.....

e não teria q sobrescrever a cada entidade sua esses métodos, somente os métodos específicos de cada entidade.


Att Davi
GOSTEI 0
Pjava

Pjava

28/04/2011

Ficou assim agora minhas classes.
import br.com.prime.modelo.Escola;
import br.com.prime.dao.DAO;
import br.com.prime.dao.EscolaDao;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

@ManagedBean
@SessionScoped
public class EscolaControle {
    
    private Escola escola;
    private DataModel listaEscola;
    
    public DataModel getEscolaAtiva(){
        List<Escola> lista = new EscolaDao().list();
        listaEscola = new ListDataModel(lista);
        return listaEscola;
    }
    
    public Escola getEscola() {
        return escola;
    }

    public void setEscola(Escola escola) {
        this.escola = escola;
    }
    
    public String preparInserirEscola(){
        escola = new Escola();
        return "gerenciarEscola";
    }
    public String DeletarEscola(){
        Escola escolatemp = (Escola)(listaEscola.getRowData());
        DAO dao = new EscolaDao();
        dao.Deletar(escolatemp);
        return "index";
    }
    
    public String prepararAlterarEscola(){
        escola = (Escola)(listaEscola.getRowData());
        return "gerenciarEscola";
    }
    
    public String adicionarEscola(){
        DAO dao = new EscolaDao();
        dao.Inserir(escola);
        return "index";        
    }
    public String alterarEscola(){
        DAO dao = new EscolaDao();
        dao.Atualizar(escola);
        return "index";
    }
}

import br.com.prime.dao.*;
import br.com.prime.modelo.*;
import br.com.prime.util.*;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class EscolaDao implements DAO<Escola>{
    
    @Override
    public List<Escola> list() {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction t = session.beginTransaction();
        List lista = session.createQuery("from Escola").list();
        t.commit();
        return lista;
    }
    @Override
    public void Inserir(Escola escola) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction t = session.beginTransaction();
        session.save(escola);
        t.commit();        
    }
    @Override
    public void Deletar(Escola escola) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction t = session.beginTransaction();
        session.delete(escola);
        t.commit();
    }
    @Override
    public void Atualizar(Escola escola) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction t = session.beginTransaction();
        session.update(escola);
        t.commit();            
    }
}
[code]
import java.util.List;
import br.com.prime.modelo.*;

public interface DAO<T> {
    public void Inserir(T t);
    public void Deletar(T t);
    public void Atualizar(T t);
    public List<T> list();
}


Agora só preciso testar isso. Terei que criar um xhtml com os campos e testar. Ainda to meio cru nisso. Esse xhtml não será o definitivo, pois receberei um e colocarei essa lógica nele. Mas eu ainda não fiz as configuraçoes do Hibernate, para conexão com o banco. Já tenho os drivers no meu ClassPath. Eu uso:
PostgreSql, Helios,Java 6, Hibernate/JPA,JSF 2.0 e Primefaces 2.2.1. Precisava acrescentar aí um DataGrid da Prime para carregar as escolas e outros. Isso é só meu começo com a ferramenta.
GOSTEI 0
Davi Costa

Davi Costa

28/04/2011

Cara, deu quase no mesmo.
O que estou querendo que vc evite, é ter que codificar todos esses códigos caso vc precise de um AlunoDAO, ProfessorDAO.

Vc vai ter que criar uma classe que implemente essa interface genérica e todos os seus DAO(s)...EScolaDAO e os outros vão extender dessa implementação genérica.

Att Davi
GOSTEI 0
Pjava

Pjava

28/04/2011

Perdoe a minha ignorancia, mas não entendi direito, Davi, o que vc realmente está falando.
GOSTEI 0
Robson Teixeira

Robson Teixeira

28/04/2011

Veja o que o davi quis dizer   public abstract class AbstractDAO<T extends Object> implements DAO<T>{               @Override
    public void Inserir(T obj) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction t = session.beginTransaction();
        session.save(obj);
        t.commit();       
    }
    @Override
    public void Deletar(T obj) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction t = session.beginTransaction();
        session.delete(obj);
        t.commit();
    }
    @Override
    public void Atualizar(T obj) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction t = session.beginTransaction();
        session.update(obj);
        t.commit();           
    }
            @Override
    public List<T> list() {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction t = session.beginTransaction();
        List<T> lista = session.createQuery("from "+getEntityType().getSimpleName()).list();
        t.commit();
        return lista;
    }
       protected abstract Class getEntityType(); }   public class EscolaDao extends AbstractDAO<Escola>{       protected Class getEntityType(){         return Escola.class;     } }     isso é um exemplo bem tranquilo e mostra claramente o que o davi queria dizer. O método getSimpleName() caso tenha duvida ele retorna o nome da classe no caso de Escola o retorno será uma String escrito "Escola". Da para melhorar mais um poco mas isso fica ao seu criterio.   qualquer coisa e so chamar att  robson Passarella  
GOSTEI 0
Davi Costa

Davi Costa

28/04/2011

Exatamente,
o Robson captou o que eu keria te passar,
não postei logo o código para vc refletir um pouc mais e entender realmente
 que deseja que vc compreendesse.
Agora para melhorar ainda mais, seu EscolaDAO vai virar uma interface e depois vc vai criar um EscolaDAOImpl, por exemplo, para vc em EscolaDAO criar seus métodos específicos que fiquem fora do CRUD tradicional,
por exemplo o método recuperaAlunosVeteranos(), esse método é específico de Escola, então só deve existir para essa interface (para esse caso de uso).

Espero ter ajudado, quaisquer dúvidas que possam surgir é só perguntar.

Att Davi
GOSTEI 0
Dyego Carmo

Dyego Carmo

28/04/2011

Funcionou ?

Se sim , por favor feche :)
GOSTEI 0
POSTAR