Classe para persistencia geral
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
Curtidas 0
Respostas
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
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
28/04/2011
Ficou assim agora minhas classes.
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.
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
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
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
28/04/2011
Perdoe a minha ignorancia, mas não entendi direito, Davi, o que vc realmente está falando.
GOSTEI 0
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
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
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
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
28/04/2011
Funcionou ?
Se sim , por favor feche :)
Se sim , por favor feche :)
GOSTEI 0