Estou montando um framework para fins estudantis e gostaria que vocês do fórum criticassem ou dessem opiniões sobre ele, irei detalhar suas funcionalidades abaixo.
Camada de Persistência
Para cada entidade(tabela) do banco tem as seguintes Classes e Interfaces.
IEntidadeDao(Interface que contém as acões CRUD para a tabela).
EntidadeDao(Classe que implementa a IEntidadeDao), classe que executa as ações usando o JDBC.
hibernate.EntidadeDao(Classe que implementa a IEntidadeDao), classe que executa as ações usando o Hibernate.
Beans
Para cada entidade(tabela) do banco tem as seguintes Classes e Interfaces.
IEntidadeBean(Interface que contém os métodos get set dos campos da entidade).
EntidadeBean(Classe que implementa a IEntidadeBean), classe Bean para transportar as informações entre as camadas(menos na view), ela tanb é utilizada para mapeamento do hibernate.
Camada de Regra de Negócios
Para cada entidade(tabela) do banco tem as seguintes Classes e Interfaces.
IEntidadeBusiness(Interface que contém as regras das ações CRUD para a tabela)
EntidadeBusiness(Classe que implementa IEntidadeBusiness), classe que contém as regras da tabela(entidade).
Factorys
Factory para gerar os Daos.
Factory para gerar as Regras de Negócios.
Factory para gerar os Beans.
Transações
Classe que gera uma única transação para diversos business e daos(inclusive para o hibernate), mas por enquanto ainda não estou usando o JTA.
Conexão
Classe q abre uma conexão via JDBC ou Hibernate(sem afetar a camada de business)
Obs: Na nomenclatura das Classes e Interfaces onde for “Entidade” seria o nome verdadeiro da tabela do banco.
Sobre a camada View ainda não criei porq estou meio indeciso ao usar Struts, WebWork ou Servlets, se crio custom tags ou utilizo JSTL, tiles, velocity entre outros…
Entaum pessoal sugestões/críticas serão bem vindas.
[quote=pcalcado]Por que você tem beans e regras de negócio como coisas separadas?
Shoes[/quote]
No meu caso os beans servem para fazer o mapeamento com o hibernate e tanb para transportar as informações entre as camadas, porq eu deveria usa-los ojunto com o negócio??
Obrigado a todos pela resposta, incrível vcs responderam muitoooo rápido, valew.
[quote=pcalcado][quote=rodrigo_corinthians]
No meu caso os beans servem para fazer o mapeamento com o hibernate e tanb para transportar as informações entre as camadas, porq eu deveria usa-los ojunto com o negócio??
[/quote]
Porque você está programando numa linguagem orientada a objetos, que tal usar esse paradigma ao invés de programação procedural
Jóia valew, irei pesquisar mais sobre o assunto e depois altero os códigos.
[quote=fabgp2001] Outra coisa, é preciso uma interface para cada entidade?
Para que elas vao servir visto que serao unica para cada entidade?
]['s[/quote]
Entaum estou usando uma interface(IDao) pai para trabalhar junto com o factory e sobre uma interface pra cada entidade eu até poderia fazer uma “genérica” mas quando eu fizer uma consulta ela me retornaria o que??? Object? :?
Irei postar um exemplo do código.
Suponhamos que temos a tabela tb_pessoa com 2 campos(id_pessoa, nm_pessoa).
A parte do bean ficará assim.
package br.com.rodrigo.stp.bean;
import br.com.rodrigo.stp.infra.factory.IBean;
public interface IPessoaBean extends IBean {
public Integer getPessoaPK();
public void setPessoaPK(Integer pessoaPK);
public String getNomePessoa();
public void setNomePessoa(String nomePessoa);
}
package br.com.rodrigo.stp.bean;
public class PessoaBean implements IPessoaBean {
private Integer pessoaPK;
private String nomePessoa;
public PessoaBean() {
super();
}
public Integer getPessoaPK() {
return pessoaPK;
}
public String getNomePessoa() {
return nomePessoa;
}
public void setNomePessoa(String nomePessoa) {
this.nomePessoa = nomePessoa;
}
public void setPessoaPK(Integer pessoaPK) {
this.pessoaPK = pessoaPK;
}
}
Quem esta fechando suas conexoes? Statements? ResultSets?
Essa tonelada e meia de codigo eh soh pra fazer o backend de um objeto Pessoa que tem 2 propriedades. O que vai acontecer quando vc tiver 150 entidades diferentes?
As suas regras de negocio nao sao conhecidas ainda, ou elas sao so isso mesmo, no geral?
Por enquanto quem fecha a minha conexão é a transação, mas em breve pretendo melhorar criando um pool de conexões, segue um exemplo usando a transação.
public class TestMain {
public static void main(String[] args) {
ITransaction t = null;
try {
t = SimpleTransaction.getInstance();
t.start(); // Inicia a transação
// Monta o objeto Pessoa -> tabela tb_pessoa
IPessoaBusiness pessoaBusiness = (IPessoaBusiness) AbstractBusinessFactory.getInstance().createBusiness(PessoaBusiness.class);
IPessoaBean pessoaBean = (IPessoaBean) AbstractBeanFactory.createBean(PessoaBean.class);
pessoaBean.setNomePessoa("Pessoa Hibernate");
pessoaBusiness.create(pessoaBean);
t.commit(); // Comita a transação
} catch(SystemException se) {
t.rollback(); // Rollback na transação
se.printStackTrace();
} finally {
t.close(); // Finaliza a transação
}
}
}
Eu fecho dentro do próprio método, está errado??
Pra falar a verdade essa arquitetura eu fiz baseada numa empresa(Gelre) onde trabalhava, participei de um projeto ERP que tinha nada menos que “500 tabelas”, afê pra vc ter uma idéia usavamos(e usam até hoje) só JDBC e vish tinha umas 10 toneladas a mais de código lá. :lol:
Sim não existem ainda, por enquanto tem apenas as regras referente ao cadastro da entidade(validações dos campos nulos, tamanhos…).
Quando vc disse essa tonelada de código era exatamente isso que estava pensando no almoço, acho que vou começar a criar genéricos para as classes Daos e suas interfaces, tanb para o Business entre outros, irá reduzir bastante o código.
Para fechar os ResultSets e Statements, fecha em um bloco finally, que garante que eles sejam fechados mesmo que ocorra uma exceção durante o método.
Acho que em um projeto com muitas tabelas no banco com vc citou, poderia ser feito um Dao por use case do sistema, alguém tem alguma opnião sobre esta aboradagem?
[quote=maikonaraujo]Para fechar os ResultSets e Statements, fecha em um bloco finally, que garante que eles sejam fechados mesmo que ocorra uma exceção durante o método.
Acho que em um projeto com muitas tabelas no banco com vc citou, poderia ser feito um Dao por use case do sistema, alguém tem alguma opnião sobre esta aboradagem?[/quote]
Jóia bem lembrado, eu só estava usando o bloco finally na transação, agora irei implementar nos Dao’s JDBC’s, valew
Concordo se por isso que vou implementar um Dao genérico, se fomos pensar o Hibernate por dentro faz isso, já que no core ele usa jdbc, me corrijam por favor se estiver errado.
O osso mesmo é fazer um Dao genérico pra JDBC, como montar as querys? :roll: