quarta-feira, 4 de abril de 2007

O Inicio


O ITrust é o inicio de um ERP open source, com cadastro de clientes, contas a pagar e etc. Este é o primeiro artigo de uma série, descrevendo a aplicação dos patterns envolvidos e bibliotecas do projeto. O conteudo dos arquivos encontra-se no source forge em https://sourceforge.net/projects/itrust.


Vamos iniciar o sistema descrevendo a hierarquia de pastas do projeto.

--+ITrust
|
|--+src
| |
| |---+org.iprogramming
| |
| |---+controller
| |---+model
| |---+view
|--+web
|
|---+css
|---+images
|---+include
|---+js
|---+pages
|---+WEB-INF

Podemos ver que as pastas são bem intuitivas e ao decorrer dos artigos vamos explorar o conteudo de cada pasta. Eu presumo que vc ja saiba criar um projeto na sua IDE de preferencia e criar esta hierarquia de pastas. Portanto vamos comecar adicionando as bibliotecas do projeto, eu uso as seguintes: Hibernate, JSF, Ajax4JSF, Tomahawk. Estas são as bibliotecas principais, porem iremos adicionar muitas outras para dar suporte a estas. Portanto baixe as bibliotecas e adicione estas ao seu projeto, caso vc tenha problemas em achar todas as bibliotecas envolvidas vá ao site do projeto no source forge e veja em detalhes as bibliotecas usadas.


Agora que ja temos o nosso projeto criado, vamos começar explorando as classes no package model, nele vamos encontar todas as classes de persistencia, acesso ao banco de dados e logica de negocio. A divisão de 'packages' usadas nesse projeto não é obrigatoria, porem voces vão perceber que eu costumo separar as classes em seus devidos packages caracterizados por funcionalidades. Vejamos abaixo uma breve descrição dos packages contidos no model.

model
|
|
|---busines
|--+persistence
|
|---+dao
| |
| |---generic
| |---hibernate
|
|---dto
|---factory
|---transaction

model --------> Contem todos os packages resposaveis pelo modelo do distema
busines ------> Representa as classes de logica de negocio do sistema
persistence --> Contem todos os packages envolvidos ao banco de dados
dao ----------> Representa as interfaces de nossos Data Access Object(DAO)
generic ------> Representa as classes e as interfaces genericas para dar suporte ao nossos DAOs
hibernate ----> Representa as classes de persistencia no banco de dados
dto ----------> Representa as classes referente aos registros no banco de dados
factory ------> Representa as classes para criar instancia de nossos DAOs
transaction --> Representa as classes para controle de transações do hibernate



Vamos iniciar explorando as classes do package dto, aqui devemos criar as classes que deverão representar os registros no banco de dados do nosso ERP. Vamos descrever cada tabela, porem vamos começar com tres tabelas basicas Company, Person e Login. Essas tabelas podem ser criadas usando a seguinte sintaxe para um banco de dados postgres

create sequence seq_company;
CREATE TABLE company
(
pk_company bigint NOT NULL DEFAULT nextval('seq_company'::regclass),
name character varying(45) NOT NULL,
description text,
CONSTRAINT ctr_company PRIMARY KEY (pk_company)
);

create sequence seq_person;
CREATE TABLE person
(
pk_person bigint NOT NULL DEFAULT nextval('seq_person'::regclass),
fk_company bigint NOT NULL,
name character varying(45) NOT NULL,
born date,
description text,
CONSTRAINT ctr_person PRIMARY KEY (pk_person),
CONSTRAINT ctr_company_in_person FOREIGN KEY (fk_company)
REFERENCES company (pk_company) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);

create sequence seq_login;
CREATE TABLE "login"
(
pk_login bigint NOT NULL DEFAULT nextval('seq_login'::regclass),
fk_person bigint NOT NULL,
"login" character varying(10) NOT NULL,
"password" character varying(10) NOT NULL,
description text,
CONSTRAINT ctr_login PRIMARY KEY (pk_login),
CONSTRAINT ctr_person_in_login FOREIGN KEY (fk_person)
REFERENCES person (pk_person) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);

Essas tabelas serão respresentadas no nosso package DTO da seguinte maneira:

public class Company implements java.io.Serializable {
//Non Fields
public boolean marked = false;
// Fields
private long pkCompany;
private String name;
private String description;
private Set<Person> persons = new HashSet<Person>(0);

//...geters and seters
}

Creio que a representação do DTO company descrito acima ja seja suficiente para que vc possa criar sozinho os demais DTO.
Existe algo fora do padrão no nosso DTO, isso é devido ao atributo marked. Esse atributo que nao existe na tabela será explorado posteriormente quando estudarmos a camada de apresentação feita em JSF. Agora que ja possuimos as nossas tabelas no banco de dados e nosso DTO, precisamos entao configurar o hibernate. Será necessário que vc crie o arquivo Company.hbm.xml, segue abaixo exemplo

<hibernate-mapping>
<class name="org.iprogramming.model.persistence.dto.Company" table="company" schema="public">
<id name="pkCompany" type="long">
<column name="pk_company" />
<generator class="sequence">
<param name="sequence">seq_company</param>
</generator>
</id>
<property name="name" type="string">
<column name="name" length="45" not-null="true" />
</property>
<property name="description" type="string">
<column name="description" />
</property>
<set name="persons" inverse="true">
<key>
<column name="fk_company" not-null="true" />
</key>
<one-to-many class="br.com.verano.model.persistence.dto.Person" />
</set>
</class>
</hibernate-mapping>

Ok, mapeamos no hibernate como funciona a nossa tabela Company. Lembre-se que estamos explorando o package DTO, portanto o arquivo Company.java e Company.hbm.xml encontra-se no package dto. Agora devemos configurar o hibernate de fato, e para isso ja existe dezenas de materiais, portanto aconselho que leia os tutorias na pasta de documentação do projeto no source forge. Não quero ficar replicando aqui os tutoriais ja existentes, o GUJ possui uma serie de artigos sobre hibernate e eu adicionei eles na pasta de documentacao do projeto, portanto eu aconselho que leia os tutorias pois no proximo artigo vamos presumir que vc ja saiba no minimo fazer uma consulta usando hibernate.


Esse foi nosso primeiro pattern abordado, o pattern DTO. O conceito descrito sobre esse pattern é relativamente simples e creio que vc nao teve muitos problemas para entender. No proximo artigo vamos explorar o Pattern DAO com hibernate e as coisas vão se tornar mais complexas



6 comentários:

Dalton Camargo disse...

www.springframework.org :)

Anônimo disse...

Olá.
Uma pergunta: porque decidiu não
usar anotações, tipo JPA?
Obrigado desde já

Ronildo Junior disse...

Olá maxwell.
Me sinto melhor trabalhando com XML, mas isso é uma questão de gosto mesmo, nada impede vc de usar anotações. Porem o hibernate.org aconselha o uso de xml, pois anotações so funcionam com o JDK 1.5 ou superior, e o hibernate é compativel com a versão 1.3

Anônimo disse...

Qual JSF vc ta usando? Poderia passar as versoes das bibliotecas?

Ronildo Junior disse...

Eu estou usando JSF 1.2
Vc pode baixar todas as bibliotecas que em uso em:
http://itrust.cvs.sourceforge.net/itrust/itrust/web/WEB-INF/lib/

Pai Rico disse...

DTO, BO...

http://fragmental.com.br/wiki/index.php?title=Evitando_VOs_e_BOs

;)