estou iniciando um novo projeto e gostaria de uma opinião sobre a maneira que pretendo organiza-lo.
primeiramente, pretendo utilizar hibernate para persistir.
todas as minhas classes de controle serão colocadas em um pacote chamado casses, e serão divididas por módulos, ex: classes.faturamento.NotaFiscal
pretendo criar um pacote dao.modulo.classe para ajudar no controle da persistencia, aqui que é minha maior dúvida: porque o hibernate ja abstrai bastante no que se diz em persistencia, porém, para que as classes de controle nao tenhao contato nenhum com o banco, achei interessante criar as “dao”. a dúvida é, vocês acham q ja posso colocar o hibernate direto nas classes de controle ou realmente é interessante o dao?
a parte visual também criarei um pacote: view.modulo
ainda não decidi a api q usarei para gerar relatórios(inclusive se alguem tiver indicações…) mas também pretendo separar por pacotes…
Sim, é uma boa prática usar o DAO (Data Access Object), um padrão de projeto que separa as regras de acesso ao banco de dados das regras de negócio do sistema, bem como de interface com o usuário. O DAO pode e deve ser utilizado mesmo no caso de utilizar o Hibernate, pois diminuirá o acoplamento entre classes com diferentes propósitos (persistência, modelo de negócio e interface), facilitando a manutenção do sistema. Além disso, um DAO bem implementado permite a utilização de diferentes bancos de dados com mínimas alterações no código.
Quanto à organização dos pacotes do projeto, não há uma receita ideal. Considerando que você deva estar utilizando o padrão MVC, vc poderia separar as classes em pacotes como:
DAO
Modelo
Controle
Visão
Resources (para imagens, etc)
Util (para classes úteis ao sistema, etc)
É apenas uma sugestão.
P
pauloglc
hum, valeu.
veja, eu andei pensando e desenvolvi uma classe que, de inicio, parece despensar a criação de um DAO por classe… para classes simples funcionou tranquilo, imagino que para algumas classes mais complexas talvez seja necessário criar um herdeiro que seja mais especifico… veja e me diz o que acha:
publicclassDataSet<T>{publicTinsert(Sessionsession,Tobjeto){booleaninTransaction=session.getTransaction()!=null;if(!inTransaction){session.beginTransaction();}session.save(objeto);if(!inTransaction){session.getTransaction().commit();}returnobjeto;}publicTinsert(Tobjeto){Sessionsession=HibernateUtil.getSessionFactory().openSession();session.beginTransaction();session.save(objeto);session.getTransaction().commit();session.close();returnobjeto;}publicTupdate(Sessionsession,Tobjeto){booleaninTransaction=session.getTransaction()!=null;if(!inTransaction){session.beginTransaction();}session.update(objeto);if(!inTransaction){session.getTransaction().commit();}returnobjeto;}publicTupdate(Tobjeto){Sessionsession=HibernateUtil.getSessionFactory().openSession();session.beginTransaction();session.update(objeto);session.getTransaction().commit();session.close();returnobjeto;}publicTinsertOrUpdate(Sessionsession,Tobjeto){booleaninTransaction=session.getTransaction()!=null;if(!inTransaction){session.beginTransaction();}session.saveOrUpdate(objeto);if(!inTransaction){session.getTransaction().commit();}returnobjeto;}publicTinsertOrUpdate(Tobjeto){Sessionsession=HibernateUtil.getSessionFactory().openSession();session.beginTransaction();session.saveOrUpdate(objeto);session.getTransaction().commit();session.close();returnobjeto;}publicTdelete(Sessionsession,Tobjeto){booleaninTransaction=session.getTransaction()!=null;if(!inTransaction){session.beginTransaction();}session.delete(objeto);if(!inTransaction){session.getTransaction().commit();}returnobjeto;}publicTdelete(Tobjeto){Sessionsession=HibernateUtil.getSessionFactory().openSession();session.beginTransaction();session.delete(objeto);session.getTransaction().commit();session.close();returnobjeto;}publicList<T>getList(Sessionsession,Classclasse){Queryquery=session.createQuery("from "+getTableName(classe));returnquery.list();}publicList<T>getList(Classclasse){Sessionsession=HibernateUtil.getSessionFactory().openSession();Queryquery=session.createQuery("from "+getTableName(classe));List<T>lista=query.list();session.close();returnlista;}privateStringgetTableName(Classclasse){StringtableName="";ClassMetadatahibernateMetadata=HibernateUtil.getSessionFactory().getClassMetadata(classe);if(hibernateMetadata==null){thrownewHibernateException("Nome da tabela não encontrado");}if(hibernateMetadatainstanceofAbstractEntityPersister){AbstractEntityPersisterpersister=(AbstractEntityPersister)hibernateMetadata;tableName=persister.getTableName();}returntableName;}}
L
luzales
pauloglc:
hum, valeu.
veja, eu andei pensando e desenvolvi uma classe que, de inicio, parece despensar a criação de um DAO por classe... para classes simples funcionou tranquilo, imagino que para algumas classes mais complexas talvez seja necessário criar um herdeiro que seja mais especifico... veja e me diz o que acha:
Sim, a ideia é essa generalizando o DAO, mas vc pode melhorar um pouco mais.
É possível criar uma interface de um DAO genérico com os principais métodos de acesso ao banco de dados, como você fez. Isso diminuirá ainda mais o acoplamento:
public interface IDAO<T>{
void save(T t);
void delete(T t);
void update(T t);
List<T> findAll();
T findById(int id);
}
Implementar a interface através de uma classe genérica:
publicabstractclassDaoGenerica<T>implementsIDAO<T>{//inicialização//métodos da interface...}
E depois utilizar:
DAO<Pessoa> pessoaDao = new DaoGenerica<Pessoa>;
pessoaDao.save(pessoa);
Para as classes que necessitem de outros métodos específicos relacionados a persistência, você poderia criar classes filhas herdando os métodos da classe GenericDAO.
Você pode melhorar ainda mais. Pesquise sobre a combinação dos padrões DAO e Facade para a camada de persistência.
Para maiores detalhes, sugiro os seguintes artigos: