Sei sulla pagina 1di 73

ESCOLA SUPERIOR ABERTA DO BRASIL ESAB LATO SENSU EM ENGENHARIA DE SISTEMAS

ALAN SAULO DA COSTA MAZUCO

REDUO SISTEMTICA DE CDIGO, TEMPO E CUSTO DE PROGRAMAO DE DADOS

VILA VELHA 2009

ALAN SAULO DA COSTA MAZUCO

REDUO SISTEMTICA DE CDIGO, TEMPO E CUSTO DE PROGRAMAO DE DADOS

Monografia apresentada ESAB Escola Superior Aberta do Brasil, do curso de Graduao Lato Sensu em Engenharia de Sistemas sob a orientao dos professores Jaime Roy Doxsey e Beatriz Christo Gobbi.

VILA VELHA 2009

A DEUS, que soberanamente justo e causa primria de todas as coisas. minha esposa, pela compreenso de minha ausncia em prol deste estudo.

AGRADECIMENTOS Aos meus orientadores, os professores Jaime Roy Doxsey e Beatriz Christo Gobbi, que se empenharam em dirimir nossas dvidas em benefcio do nosso preparo individual.

Fazer pelos outros o que querereis que os outros fizessem por ns a expresso mxima da caridade. (Allan Kardec)

RESUMO

Este estudo objetiva explorar os trabalhos realizados por uma fbrica de software, particularmente a elaborao de cdigo-fonte, que por muitas vezes resulta em trabalho cansativo e repetitivo. Foca as principais tecnologias de software existentes no mercado que facilitam este trabalho, bem como a abordagem de um framework genrico de acesso a dados que interage com as camadas mais superiores de qualquer sistema e com qualquer tipo de banco de dados empregado, realizando todas as operaes de persistncia, cuja pretenso a reduo sistemtica da quantidade de cdigo produzida por uma equipe cuidadosamente treinada. Os softwares escolhidos na explorao deste estudo so livres, portanto, pretende-se demonstrar que podem ser obtidos excelentes resultados com essas ferramentas, tendncia que vem aumentando dia-a-dia junto aos profissionais de TI, em todo o mundo.

SUMRIO

INTRODUO 1 1.1 1.2 1.2.1 1.2.2 1.3 2 2.1 2.2 2.3 2.4 2.4.1 2.4.2 2.5 2.5.1 2.5.2 2.5.3 2.5.4 3 3.1 3.1.1 3.1.2 3.1.3 3.1.4 3.2 3.2.1 3.2.2 3.2.2.1 3.2.2.2 3.2.2.3 3.2.2.4 3.2.3 3.2.3.1 3.2.3.2 3.2.3.3 3.2.3.4 3.2.3.5 A LINGUAGEM JAVA COMO PONTO DE PARTIDA POR QUE JAVA, AFINAL? O JAVA E SEUS AMBIENTES Ambientes de desenvolvimento Ambiente de execuo O JAVA EM AO PROGRAMAO ORIENTADA A OBJETOS CONSIDERAES INICIAIS SOBRE POO POO BSICA ENTENDENDO A POO CLASSES E OBJETOS Diferenas entre classe e objeto Estrutura de uma classe Java HERANA ENCAPSULAMENTO E POLIMORFISMO Uma quebra de paradigmas Herana Encapsulamento Polimorfismo TECNOLOGIAS DE PERSISTNCIA A DADOS HIBERNATE O que Hibernate? Hibernate x Bancos de Dados Persistncia a dados antes do Hibernate Persistncia a dados com o Hibernate JPA O que JPA? Mapeamento Objeto-Relacional (ORM) Conceito Um modelo a ser mapeado Cardinalidade entre entidades Mapeando para o banco de dados EntityManager: O corao da JPA JPA, EJB, Hibernate. E agora? Gerenciador de Entidades Ciclo de vida dos objetos persistentes Pool de conexes Gerenciamento de transaes com o EntityManager

1 3 3 5 5 5 6 10 10 11 10 13 13 16 18 18 18 19 20 22 22 22 22 23 24 25 25 26 26 27 28 30 34 34 35 36 39 41

4 4.1 4.2 4.2.1 4.2.2 4.2.3 4.2.4 5 5.1 5.2 5.3 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4 5.4.1 5.4.2 5.4.3 5.4.4

FERRAMENTAS IDE QUE SO FERRAMENTAS IDE? ECLIPSE Palavras iniciais A workbench Como so gerenciados os projetos O editor de cdigos FRAMEWORK - DAO GENRICO ARQUITETURA VISO FSICA DOS PACOTES ENVOLVIDOS ANLISE DAS CLASSES ENVOLVIDAS AbstractDao Dao DaoFactory DomainFactory DaoException CriteriaConfiguration Exemplo de uma Facade OUTRAS CONFIGURAES spring.xml log4j.properties persistence.xml spring-injection.xml

43 43 45 45 46 46 48 49 49 51 52 52 52 53 54 55 57 58 59 59 60 60 61 62 63

CONCLUSO REFERNCIAS BIBLIOGRFICAS

INTRODUO
DAO Java tecnologia Por durante algum tempo os profissionais de TI procuraram as melhores alternativas com vistas a reduzir a complexidade do cdigo-fonte utilizado em seus sistemas. Isto era realmente uma tarefa difcil h alguns anos atrs, haja vista as prprias tecnologias utilizadas na poca e o tamanho dos sistemas em si, com vrios mdulos implementados, o que resultava, na maioria das vezes, em extensos blocos de cdigos, difceis de serem compreendidos, e o que pior, difceis de serem manutenidos. Mas o mundo estava mudando, de uma maneira bem acelerada, exigindo uma demanda por informaes cada vez mais rpidas, precisas e concisas. Os profissionais de TI passaram a se preocupar mais com a qualidade e o cumprimento de prazos. Face a demanda, foi ento que comearam a surgir no mundo da informtica, equipamentos mais robustos e softwares mais inteligentes. E novas tecnologias foram surgindo. No ano de 1991, a Sun Microsystems financiou um projeto de pesquisa corporativa, o Projeto Green, que era o desenvolvimento de uma nova tecnologia baseada na linguagem C++. Seu criador, James Gosling, chamou-a de Oak, em homenagem a uma rvore de carvalho vista por sua janela de dentro dos laboratrios da Sun. Descobriu-se mais tarde que j havia uma linguagem de programao com o nome Oak. Quando uma equipe da Sun visitou uma cafeteria local, o nome Java foi sugerido. Java o nome de uma cidade da Indonsia que exporta um tipo de caf muito consumido nos Estados Unidos. O Projeto Green passou por muitas dificuldades, pois o mercado de computadores voltado para o consumo popular no estava se desenvolvendo to rpido como a Sun esperava. Corria-se o risco de todo o projeto ir por gua abaixo at que, por uma feliz casualidade, a World Wide Web apareceu em 1993. Ento a Sun anunciou o Java formalmente em uma importante conferncia em maio de 1995. O Java

chamou a ateno da comunidade de negcios por causa do enorme interesse da World Wide Web. Porm, mesmo com uma ferramenta fantstica quanto o Java, os problemas com cdigo-fonte extenso e a complexidade ainda perduravam. Era necessrio algo mais, alguma coisa que pudesse ser colocada em funcionamento junto com todos os mdulos de um sistema, realizando o trabalho pesado, por assim dizer. E, melhor ainda, que os programadores nem vissem como se desse tal trabalho, que isto fosse totalmente transparente para eles, de forma a que eles nem precisassem se preocupar com esses detalhes. Se assim o fosse, os programadores iriam utilizar o seu tempo em outras atividades, produzindo cdigo, mas em nveis de camadas mais superiores, como a implementao visual e as regras de negcios. At bem pouco tempo, era necessrio a criao de um DAO (Objeto de Acesso a Dados) para cada funcionalidade do sistema. Por exemplo: para inserir o registro de um aluno no banco de dados, era necessrio um objeto alunoDAO, para inserir um professor, um objeto professorDAO, e por a vai. O grande pulo do gato seria se pudssemos inserir tanto professor quanto aluno com um nico objeto dao, em momentos distintos, e com isto reduzindo o cdigo pela metade! Este seria o sonho de toda fbrica de software, impossvel de se realizar. Seria? (...)

1 1.1

A LINGUAGEM JAVA COMO PONTO DE PARTIDA POR QUE JAVA, AFINAL?

Partindo do princpio de que a linguagem Java foi projetada com vistas a ser uma tecnologia totalmente orientada a objeto, e principalmente, ser portvel, fica fcil entender por que a maioria das empresas hoje em dia est migrando seus sistemas para ela. [...] De uns anos para c, o Java se consolidou como a linguagem mais usada por programadores e grandes corporaes em todo o mundo (MOREIRA NETO, 2006, p.2). E ainda (MOREIRA NETO, 2006, prefcio):
[...] Se a necessidade desenvolver para a Internet, ele se adapta rapidamente a esse ambiente e fica sem concorrentes altura; se preciso programar para dispositivos mveis como handhelds ou celulares, de novo ele oferece os melhores recursos; caso o programador pretenda desenvolver algo explorando todo o potencial da orientao a objetos, o Java, de novo, a melhor soluo.

No obstante, importante ressaltar as observaes feitas por dois talentosos profissionais da rea de TI (FRANCO e YOSHIDA, 2004, prefcio):
[...] Mas, de uns anos para c, uma linguagem consolidou-se na preferncia dos desenvolvedores de software. muito difcil, atualmente, encontrar uma empresa que no utilize ou que no tenha ao menos cogitado migrar suas ferramentas de desenvolvimento para o Java.

E o que diz Edson Gonalves, diga-se de passagem, um dos brasileiros que mais vende livros sobre Java no Brasil (GONALVES, 2007, p.8):
[...] A linguagem Java nos dias de hoje utilizada por grandes bancos, pois fornece extrema segurana. Tambm utilizada por grandes empresas que desejam trafegar uma grande quantidade de dados e necessita de estabilidade e portabilidade entre outras empresas. Milhes de pessoas j aprenderam essa linguagem e, grandes empresas a esto usando. Lugares como a NASA, IBM, ESPN entre outros so apenas exemplos da confiabilidade que a linguagem Java demonstra em seus utilizadores.

O Banco do Brasil foi uma das pioneiras, considerado um marco para o Java no Brasil. Aliado a ele, outras como a Caixa Econmica Federal e at o Exrcito Brasileiro esto migrando suas plataformas, este ltimo, instituio a qual tive o prazer de trabalhar, migrou toda a sua folha de pagamento para a tecnologia Java. E s isto j nos d uma grande credibilidade, tendo em vista que o Exrcito Brasileiro possui a segunda maior folha de pagamento do pas, s perdendo pela do INSS. Alm da portabilidade, que a capacidade dos sistemas rodarem em qualquer tipo de sistema operacional, aliam-se outras vantagens, dentre as quais:

Recursos de Rede; Segurana, executabdo programas via rede com vrias restries; Desalocao de memria automtica por processo de coletor de lixo.

Agora fica mais fcil entender o motivo pelos quais o grfico da figura 1 mostra o Java em uma curva muito ascendente em relao as outras linguagens. Perceba que a sua curva sobe vertiginosamente em detrimento de outras tecnologias, fato que vem ocorrendo desde o ano de 2000.

Figura 1 Curvas de utilizao das principais linguagens de programao. Fonte: http://www.ohloh.net/languages/compare (maio/2009)

1.2 1.2.1

O JAVA E SEUS AMBIENTES Ambientes de desenvolvimento

Com o Java possvel ter softwares rodando em vrios tipos de mquinas, como telefones celulares e robs, por exemplo. Devido a esta caracterstica, a linguagem Java conta com trs conhecidos ambientes de desenvolvimento: o J2SE, o J2EE e o J2ME. Rafael Steil, importante colaborador do frum www.guj.com.br, considerado o maior frum sobre Java no Brasil, escreveu um artigo denominado Sopa de Letrinhas sabor Java, onde relata um pouco sobre esta miscelnea de tecnologias que, a princpio, parecem complicadas (STEIL, 2003, www.guj.com.br): [...] J2SE (Java 2 Standard Edition): a verso bsica, destinada ao
desenvolvimento da maior parte das aplicaes de desktop e estaes de trabalho. Se voc est perdido e no sabe o que pegar no site da SUN, este que voc est procurando. J2EE (Java 2 Enterprise Editition): Verso destinada ao desenvolvimento de aplicaes de grande porte, as quais fazem extenso uso de EJB (Enterprise Java Beans) e Servidores de Aplicao, por exemplo. Outro grande personagem desse pacote so as servlets! A implementao padro chama-se J2SDKEE (Java 2 Software Development Kit Enterprise Edition). J2ME (Java 2 Micro Edition): Destinada ao desenvolvimento de programas para perifricos mveis ou de pequeno porte, como celulares e relgios [...] .

1.2.2

Ambiente de execuo

O Java conta ainda com um outro tipo de ambiente que nada tem a ver com o desenvolvimento: a JVM (Java Virtual Machine), tambm conhecida como JRE (Java Runtime Enviroment). Trata-se de um ambiente especificamente voltado para a execuo propriamente dita dos programas. por causa deste programa que os sistemas feitos em Java podem rodar no Windows e no Linux, por exemplo. Podemos dizer que um programa Java no roda no Windows, mas sim na JVM instalada no Windows, o processo anlogo a outros sistemas operacionais. A JVM

emula uma espcie de sistema operacional prprio, dentro do outro em que ela foi instalada. A Java Virtual Machine um aplicativo de software que pode ser instalado em um computador que contenha qualquer tipo de sistema operacional. No pacote de instalao ela chamada de JRE (Java Runtime Environment) . Depois de instalada, a JVM oculta o sistema operacional original do computador de seus programas-java, passando a funcionar como uma espcie de novo sistema operacional, da, no necessita do original para rodar seus programas. por isso que a cada dia que passa aumenta sempre mais o nmero de empresas interessadas nesta tecnologia. Ela multiplataforma e pode rodar em qualquer computador, com qualquer tipo de sistema operacional instalado.

1.3

O JAVA EM AO

Os programas Java passam por cinco fases, a saber: 1 Fase: EDIO; 2 Fase: COMPILAO; 3 Fase: CARGA; 4 Fase: VERIFICAO; 5 Fase: EXECUO. A 1 fase consiste em editar um arquivo com um programa editor. Poder ser utilizado um programa editor de textos qualquer, caso no se queira utilizar um ambiente IDE (Integrated Development Environment Ambiente Integrado de Desenvolvimento). Importante se destacar aqui que aplicativos Java podem ser escritos sem a utilizao de IDEs, como o Eclipse ou o NetBeans, por exemplo. O cdigo pode ser digitado ali e gravado em um arquivo no disco duro do computador, com uma extenso do tipo .java. Um bom editor de textos que se pode usar para desenvolver cdigos .java o Bloco de Notas do Windows . claro que este programa gera arquivos com a extenso .txt, mas logo aps a sua gravao no

disco, basta renomear o mesmo com a extenso .java. As IDEs, como o Eclipse ou o NetBeans, tambm possuem seus prprios editores de cdigo. Na 2 fase, o programador utiliza o comando javac para compilar o programa. O comando javac s estar disponvel dentro do computador aps a instalao do ambiente Java J2SE Development Kit (JDK). Por exemplo: Para compilar um arquivo chamado BemVindo.java, dever ser digitado: javac BemVindo.java Presumindo que se esteja utilizando o sistema operacional Windows XP ou Vista, para se fazer isto, utilizaramos o Prompt de Comando, tambm chamado de Janela de Comando. Se o programa compilar sem nenhuma mensagem de erro, o compilador produzir um arquivo chamado BemVindo.class que conter a verso compilada do programa dentro do diretrio onde se encontra o .java que o deu origem. O que ocorre que o compilador Java transforma o cdigo digitado em outro cdigo, denominado bytecodes, que conter uma espcie de linguagem de mquina, ou seja, um cdigo que somente a mquina pode entender.

Linguagem Humana

Bytecodes

Digitao de comandos Inteligveis aos seres humanos:

COMPILA

public class BemVindo{ public static void main( Strings args[] ){ System.out.println( Bem vindo ao mundo Java! ); } }

Gerao de cdigo pelo compilador, somente inteligvel para a mquina.

Figura 2 Linguagem humana e bytecodes.

Na verdade, os bytecodes diferem um pouco de linguagem de mquina gerada por outros tipos de linguagens. Acontece que ela sempre dependente do ambiente operacional em que foi gerada. Veja que a linguagem de mquina produzida pelo

Delphi da Borland ou o Visual Basic da Mycrosoft, s funciona no sistema operacional Windows, que a plataforma onde ela foi gerada, ao contrrio dos bytecodes gerados pelo Java que so portveis, ou seja, multiplataforma, podendo funcionar em todos os sistemas operacionais, como o Windows, Linux, Unix, Solaris e Mac OS X. claro que em cada sistema desses dever ser instalada a mquina virtual do Java ou a Java Virtual Machine (JVM) especfica a cada um, descrita no tpico anterior. Deitel, em sua famosa obra JAVA, como programar postula algo sobre isto (DEITEL, 2005, p.10):
[...] O compilador Java converte o cdigo-fonte Java em bytecodes que representam as tarefas a serem realizadas durante a fase de execuo (fase 5). Os bytecodes so executados pela Java Virtual Machine (JVM) Ao contrrio da linguagem de mquina, que dependente do hardware especfico, os bytecodes so instrues independentes de plataforma.

A 3 fase se inicia quando se utiliza o comando java, como abaixo: java BemVindo Para fazer isso, utiliza-se o Prompt de Comando do Windows, no caso de estar utilizando o Windows NT/2000/XP/Vista. o CARREGAMENTO do programa j compilado. Digitando java BemVindo, estaremos invocando a Java Virtual Machine (JVM) a carregar o programa BemVindo na memria do computador.

Figura 3 No Prompt de Comando invocado a JVM.

Na 4 fase, o verificador de bytecodes da JVM examina o cdigo para assegurar que eles sejam realmente vlidos e no violem as restries de segurana. O Java impe um forte sistema de segurana ao fazer esta verificao, impedindo que

programas mal elaborados ou mesmo arquivos hostis possam danificar o computador. A 5 e ltima fase a execuo propriamente dita do programa. Quem faz o trabalho, como dissemos, a JVM, previamente instalada no computador. Nesta fase, em geral, a JVM executa os bytecodes utilizando uma combinao de interpretao denominada just-in-time (JIT). Ento, o computador realmente s entende de linguagem de mquina, no de bytecodes. Podemos dizer que o compilador Java realiza duas compilaes: a primeira, quando codifica a linguagem humana para bytecodes, e a segunda, quando transforma os bytecodes em linguagem de mquina, totalmente inteligvel para o computador. Podemos dizer que o compilador Java realiza duas compilaes: a primeira, quando codifica a linguagem humana para bytecodes, e a segunda, quando transforma os bytecodes em linguagem de mquina, totalmente inteligvel para o computador.

Linguagem Humana

COMPILA

Bytecodes

COMPILA

Linguagem de Mquina

Figura 4 Linguagem humana, bytecodes e linguagem de mquina.

Perceba ento que um programador Java necessita de: Um Editor de Textos para programar; JDK para compilar; JVM para rodar o programa.

10

2 2.1

PROGRAMAO ORIENTADA A OBJETOS CONSIDERAES INICIAIS SOBRE POO

A linguagem Java muito poderosa, pois ela extremamente estvel, segura e, para a alegria de todos os aficionados da informtica, totalmente portvel, podendo rodar em qualquer sistema operacional. Esta ltima caracterstica a responsvel pelo enorme crescimento do nmero de usurios no mundo todo. A linguagem Java no de difcil compreenso, o problema que ela totalmente orientada a objetos e para que o aprendizado se torne menos rduo, o conhecimento de POO (Programao Orientada a Objetos) fundamental. Na realidade foi difcil quebrar o paradigma. O que se precisa entender direito a Programao Orientada a Objetos, que poder ser utilizada por qualquer outra linguagem, como o Pascal, por exemplo. Convm acrescentar tambm (BITENCOURT, 2004, www.guj.com.br):
[...] Com as tcnicas de orientao a objeto, possvel obter resultados considerados impossveis pensando de maneira estruturada. Como Java no deixa ao programador a opo de escrever ou no orientado a objetos (como em C++), os conceitos de oop devem estar bem fundamentados.

2.2

POO BSICA

Um conceito clssico de POO (FRANCO YOSHIDA, 2004, p.20):


[...] Nossa compreenso e nosso relacionamento com o mundo se do, em boa parte, por meio do conceito de objeto. Quando observamos as coisas e os seres em nossa volta, tendemos a procurar identificar o que cada uma dessas diferentes entidades. E a idia de o que implica as caractersticas da entidade: para que serve, qual a sua aparncia, etc.

No mundo real, cada objeto possui atributos que os identificam. Alm dos atributos, podemos tambm identificar o que os objetos so capazes de fazer ou para que eles

11

servem. Pense em um automvel: seus atributos seriam a marca, o modelo, a cor; e para que serve um automvel, afinal? Para transportar pessoas, para acelerar a 120 km/h ou para passear.

2.3

ENTENDENDO A POO

Em linguagem de programao, estudamos os objetos que compem um aplicativo de software sobre o ponto de vista de seus atributos (caractersticas) e seus mtodos que utilizam para fazer funcionar um programa. A Programao Orientada a Objetos , dentro da tecnologia Java, modela software de maneira bem anloga interpretao dos seres humanos, ou seja, v tudo como objetos, com suas caractersticas e seus mtodos de trabalho. Assim sendo, um objeto automvel tratado como uma classe: a classe automvel, que conter seus atributos e seus mtodos. Uma classe pode conter vrios atributos e vrios mtodos. Cada classe contm um conjunto de mtodos que manipulam dados e fornecem servios aos usurios. As classes so uma espcie de modelo que, a partir delas, podemos criar vrios objetos. Podemos instanciar (criar) muitos objetos a partir de uma nica classe.

Figura 5 Classes e objetos.

12

Partindo de uma analogia bem simples, para que possamos entender as classes e seus contedos, suponha que voc queira assistir a um vdeo no seu DVD-player da sala de estar. O que dever acontecer antes de voc assistir ao filme? Bem, antes de qualquer coisa, voc dever introduzir o disco e apertar o play. Claro que voc sabe fazer isso, mas ser que voc, realmente, entende como se d o processo automatizado de, ao apertar o play, o filme comear a rodar? A tecla play do DVDplayer oculta os complexos mecanismos que fazem o filme rodar, assim como a tecla stop oculta os mecanismos que fazem o filme parar. isto que permite as pessoas com nenhum conhecimento de eletrnica fazer um DVD-player funcionar.

Figura 6 Voc sabe realmente o que acontece quando voc aperta a tecla play de um DVD-player?

Vamos trazer isto para o mundo mais prximo da programao. Para realizar uma tarefa em um programa necessrio um mtodo. O mtodo descreve os mecanismos que realmente realizam as tarefas, ocultando de seus usurios a forma como ele faz isso, exatamente como a tecla play do DVD-player oculta como o filme comea a rodar. Poderamos dizer que, ao apertar a tecla play, um mtodo chamado (ns chamamos este processo de chamada de mtodo). Vamos dar um nome para ele, digamos iniciaPlay. Ento, ao apertarmos a tecla play, o mtodo iniciaPlay disparado e executado. Em um programa de computador este mtodo poderia ser escrito, mais ou menos assim, obedecendo a uma seqncia lgica: 1. Atracamento do disco no compartimento do motor que o faz rodar;

13

2. Liberao de corrente eltrica para acionamento do motor que faz girar o disco; 3. Posicionamento do leitor tico que faz a leitura do disco; 4. Liberao de som e imagem atravs da leitura tica; 5. Processamento de som e imagem; 6. Canalizao de som e imagem para o aparelho de TV conectado ao DVD-player. Claro que eu no sou perito em eletrnica, mas, na prtica isto o que deve acontecer. E eu me pergunto: o que o usurio do DVD-player precisou fazer? Apenas apertar a tecla play! Todos as tarefas do mtodo iniciaPlay foram ocultadas, em outras palavras, o usurio no sabe como funciona a tecla play.

2.4 2.4.1

CLASSES E OBJETOS Diferenas entre classe e objeto

Deitel nos alerta o seguinte (DEITEL, 2005, p.82):


[...] Uma classe pode ser utilizada para criar uma instncia da classe chamada de objeto. Esta uma das razes de o Java ser conhecido como uma linguagem de programao orientada a objetos. Um objeto tem atributos que so portados com o objeto quando ele utilizado em um programa.

Tomemos como exemplo um relgio de pulso. Qual a aparncia deste relgio? E para que serve um relgio de pulso? As respostas a essas perguntas traduzem bem o conceito de objeto para o mundo da programao, pois a aparncia do relgio tudo aquilo que ele , e para que um relgio serve, tudo aquilo que ele sabe fazer. Um objeto alguma coisa real. Tem suas caractersticas prprias e sabe fazer alguma coisa. Olhando para o objeto relgio na figura 7, podemos dizer que todos os seus atributos podem ser ajustados, ou seja, podem ser definidos. Por exemplo: podemos definir a cor da sua pulseira como sendo azul, no obstante podemos at definir o seu preo, quem vai ser o seu novo dono, etc.

14

Figura 7 Classes e objetos.

Constituem a verdadeira essncia de qualquer programa, onde so armazenados dados de todos os tipos. So denominadas variveis, porque os dados armazenados nelas podem ser modificados a qualquer instante dentro do programa, conforme as necessidades. Sempre que o programa precisar buscar informaes, elas estaro l disponveis, prontas para o uso ou para receberem novos valores, bastando inici-las no corpo da classe. Podemos afirmar com certeza que um objeto qualquer, ao ser criado na natureza, recebe atributos, mas ns podemos modific-los. Os atos de modificar atributos tambm podem ficar implcitos ao objeto. Trazendo para o mundo do computador, esses atos de modificao de um atributo ou realizao de qualquer coisa, so chamados de mtodos. Assim sendo, abstraindo o nosso exemplo para o mundo da programao, o objeto poderia conter mtodos que faam alguns servios, como, por exemplo, ajustar a hora do relgio. Assim: - Relgio, por favor, ajuste a sua hora para meia noite, em ponto! A figura 8, algo que saiu da minha cabea neste momento, tem a pretenso de acabar, de uma vez por todas, as dvidas que ainda poderamos ter a respeito deste assunto:

15

Figura 8 Como o Java cria objetos.

16

2.4.2

Estrutura de uma classe Java

Uma classe, basicamente, possui dois grupos de elementos: - Grupo das variveis; - Grupo dos mtodos. Esta uma classificao geral adotada pela maioria dos programadores e autores, mas eu gosto de dizer que ainda existe um terceiro grupo intermediando os dois: O grupo dos construtores. Os construtores servem para inicializar as variveis declaradas no topo da classe e eles no so obrigatrios.

public class Pessoa { /********************************* * grupo das variveis *********************************/ private String nome; private String sexo; private int idade; /********************************* * grupo dos construtores * - podemos ter mais de um *********************************/ public Pessoa(int idade){ this.idade = idade; } /********************************* * grupo dos mtodos *********************************/ public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getSexo() { return sexo; } public int getIdade() { return idade; } public void setIdade(int idade) { this.idade = idade; } public void setSexo(String sexo) { this.sexo = sexo; } }

Figura 9 Esqueleto de uma classe Java.

17

A classe declarada a partir de um qualificador. Os qualificadores utilizados para definir a visibilidade da classe so apenas trs: public protected private Alm desses existem mais outros quatro que, combinados com os trs j citados, alteram o comportamento de uma classe. So eles: abstract, final, strictfp e static. Uma classe pode conter mais de um construtor, porm com assinaturas diferentes. O construtor da classe utilizado para inicializar variveis. Sobre os mtodos, vejamos (DEITEL, 2005, p.63):
[...] Um mtodo pode especificar muitos parmetros separando cada um deles do prximo com uma vrgula. O nmero de argumentos em uma chamada de mtodo deve corresponder ao nmero de parmetros na lista de parmetros da declarao do mtodo chamado. Alm disso, os tipos de argumento na chamada de mtodo devem ser consistentes com os tipos dos parmetros correspondentes na declarao do mtodo [...].

Os pacotes so estruturas de diretrios utilizados para organizar classes e interfaces. Um pacote nada mais do que um diretrio onde so agrupadas determinadas classes com afinidades. As classes residentes dentro de pacotes devem declarar, em sua primeira linha, o nome do pacote em que reside. Caso a classe necessite, ou dependa de outras classes residentes em pacotes diferentes, dever import-las utilizando o comando import.

Figura 10 Importao de pacotes.

18

2.5 2.5.1

HERANA, ENCAPSULAMENTO E POLIMORFISMO Uma quebra de paradigmas

A orientao a objetos surgiu para resolver uma srie de problemas no mundo da programao e se tornou um paradigma, no qual um programa seria estruturado em objetos, enfatizando os aspectos de abstrao, encapsulamento, herana e polimorfismo. Alis estes conceitos so especficos da POO e seu entendimento fundamental para o programador que se aventura quebra deste paradigma. Franco e Yoshida falam um pouco sobre isto, e citam o termo paradigma de programao, acrescentando ainda (FRANCO YOSHIDA, 2004, p.21):
[...] A orientao a objetos muito mais apropriada para o desenvolvimento de sistemas, permitindo tratar os problemas de um modo parecido com o nosso entendimento do mundo, em vez de ser voltada para as caractersticas de funcionamento dos computadores, como faz o paradigma da programao procedural.

2.5.2

Herana

Segundo Deitel, a Herana pode ser entendida como (DEITEL, 2005, p.301):
[...] Uma forma de reutilizao de software na qual uma nova classe criada, absorvendo membros de uma classe existente e aprimorada com capacidades novas ou modificadas [...].

Considere as entidades da figura 11. Observe que todas elas possuem alguns atributos comuns e realizam certas tarefas comuns. Todas, por exemplo, possuem o atributo patas e o mtodo comum articulaPata, alm de outros. A idia agrupar os atributos e os mtodos comuns e coloc-los em outra entidade, mesmo que para isto tenhamos que criar outras classes intermedirias. [...] o programador pode designar que a nova classe dever herdar membros de uma classe existente [...] (DEITEL, 2005, p.301).

19

A figura 12 mostra o resultado deste trabalho.


Abelha asas patas ferrao olhos fabricaMel voa inoculaVeneno articulaPata Caranguejo patas carapaca olhos andaParaTras articulaPata Aranha patas ferrao olhos glandulaTeia fabricaTeia inoculaVeneno articulaPata

Figura 11 Entidades Abelha, Caranguejo e Aranha em um momento inicial.

Figura 12 Resolvendo problemas com a herana.

Agora, a classe Artropodes pai das classes Caranguejo e Peconhentos. Por sua vez, a classe Peconhentos pai das classes Abelha e Aranha. As classes filhas herdam todos os atributos e mtodos das classes pai.

2.5.3

Encapsulamento

O encapsulamento consiste em esconder os detalhes de uma classe. como se a isolssemos do mundo externo tornando-as intocveis. Toda vez que uma alterao deva ser feita em algumas de suas variveis, devero ser feitas atravs de um mtodo da prpria classe, pois assim, caso alguma modificao deste tipo ocorra,

20

saber-se-ia exatamente quais mtodos interagiram com a varivel, prevenindo alteraes acidentais. Segundo Sierra e Bates, em seu divertidssimo Use a Cabea! JAVA (SIERRA e BATES, 2005, p. 58):
[...] Aqui est uma regra prtica inicial para o encapsulamento (todas as isenes de responsabilidade referentes s regras prticas so aplicveis): marque suas variveis de instncia com private e fornea mtodos de captura e configurao pblicos, para ter controle sobre o acesso [...].

Basicamente encapsulamos uma classe utilizando dois mtodos, a saber: getter e setter. permitido ao usurio ver apenas os dados necessrios, todo o resto seria mantido escondido, atravs dos modificadores private e protected. A utilizao de encapsulamento em cdigos dever ser procurada, ao mximo, pois s assim se estar usando a verdadeira orientao a objetos. Deve-se evitar a utilizao do modificador public em declaraes de variveis, utilizando-o apenas nos mtodos, conforme cada caso. Deve-se tambm ter o cuidado ao utilizar o encapsulamento. sempre bom planejar o que realmente deve retornar os mtodos getters. Muitas vezes, no basta retornar apenas o que foi definido para uma varivel. Talvez, aps a definio, ela deva interagir com as demais classes, realizando clculos (por que no?) e s depois disto ela conter o valor de que o programa necessite.

2.5.4

Polimorfismo

Tomando por base a figura 18, vemos que a classe que d a origem a tudo (a grande superclasse) Artropode. Portanto, ns temos suas filhas e netas, as classes Peconhetos, Caranguejo, Abelha e Aranha. As classes-filhas herdam tudo das classes-pai. Em outras palavras, podemos dizer que uma classe-filha contm uma classe-pai. Ento, podemos dizer assim:

21

Abelha peonhenta; Abelha artrpode; Aranha artrpode; Peconhentos so artrpodes (pelo menos neste exemplo). Partindo deste raciocnio, ser que possvel a compilao do cdigo abaixo? Artropodes artropodes = new Abelha(); Claro que possvel! Isto o conceito de polimorfismo. Pois Abelha contm tudo de Artropodes. Mas preciso ter cuidado! Neste exemplo, a abelha vai perder todas as caractersticas das peonhentas. Acontece que o polimorfismo s admite a transformao de objetos de acordo com a classe-pai instanciada, no caso acima, a abelha ter todas as caractersticas prprias de sua classe e tambm as caractersticas da classe Artropodes, e nada mais. No possvel a compilao do cdigo abaixo: Abelha abelha = new Artropodes(); ...pois Artropodes no contm nada de Abelha. No exemplo, podemos afirmar que o Polimorfismo e a Herana possibilitam fazer com que a abelha movimente as patas sem precisar usar muitos cdigos. Concluindo com Sierra e Bates (SIERRA e BATES, 2005, p. 137):
[...] No polimorfismo, o tipo da referncia pode ser uma superclasse com o tipo do objeto real. Com o polimorfismo voc pode escrever um cdigo que no tenha que ser alterado quando novos tipos de subclasse foram introduzidos no programa.

22

3 3.1 3.1.1

TECNOLOGIAS DE PERSISTNCIA A DADOS HIBERNATE O que Hibernate?

O Hibernate um framework ORM ( Object-Relational Mapping) ou Mapeamento Objeto-Relacional para o ambiente Java que uma das implementaes oficiais da JPA (Java Persistence API). Segundo a documentao oficial, "[...] o Hibernate tem por finalidade a reduo de 95% das tarefas mais comuns de persistncia de dados". (HIBERNATE COMMUNITY DOCUMENTATION, www.hibernate.org). Segundo Edson Gonalves, o Hibernate (GONALVES, 2007, p.512):
[...] um projeto audacioso que procura ter uma completa soluo para o problema de gerenciamento de dados persistentes em Java. O Hibernate um framework que se relaciona com o banco de dados, onde esse relacionamento conhecido como mapeamento objeto/relacional para Java, deixando o desenvolvedor livre para se concentrar em problemas da lgica de negcios.

3.1.2

Hibernate x Bancos de Dados

A maioria dos sistemas desenvolvidos, principalmente corporativos, dispe suas informaes gravadas em bancos de dados relacionais. A persistncia a dados sempre foi tarefa rdua para o programador, o que gerava grandes problemas. Hoje em dia esses problemas foram substancialmente minimizados com o surgimento de novas tecnologias, como o Hibernate, por exemplo. Vejamos, novamente, Edson Gonaves (GONALVES, 2007, p.513):
[...] Por anos a persistncia de dados foi um tpico problemtico por entre os desenvolvedores Java. O debate era extenso, mas muitos se envolviam em situaes como a de automatizar funes existentes no sistema armazenando-as no banco de dados e que, com mudanas no sistema, a troca de um banco de dados causava transtornos imediatos[...]

23

3.1.3

Persistncia a dados antes do Hibernate

Para que possamos entender como o Hibernate colabora na reduo de cdigo e na simplificao dos casos de uso de um sistema qualquer, no que tange a persistncia a dados, necessrio saber como este processo se dava antes de seu surgimento. Tomemos como exemplo um banco de dados com uma tabela chamada ALUNO. Para a incluso de um registro nesta tabela, era necessrio um cdigo mais ou menos parecido com os da figuras 13 e 14. Para tanto, utilizava-se (e ainda se usa at os dias de hoje, em alguns casos) uma API nativa do Java denominada JDBC.

Figura 13 Classe de conexo com banco de dados.

Figura 14 Classe de persistncia com JDBC.

24

Percebe-se a o enorme esforo no intuito de persistir uma nica linha em um banco de dados para um nico objeto. Duas classes a so necessrias: uma para realizar a conexo e outra para persistir, ambas contendo vrias linhas, muito cdigo para ser analisado e manutenido.

3.1.4

Persistncia a dados com o Hibernate

O Hibernate surgiu e acabou com todo o esforo de programao mostrado no tpico anterior. O cdigo da figura 15 realiza a mesma tarefa mostrada nas figuras 13 e 14.

Figura 15 Classe de persistncia com Hibernate.

claro que para este cdigo funcionar o Hibernate dever ser previamente configurado, ocorrendo a supresso dos cdigos da figura 13. A conexo seria feita por intermdio de um arquivo de contexto onde este framework receberia os parmetros de configurao relativos ao banco de dados. Da, sendo necessria a troca do banco, bastar-se-ia modificar estes parmetros, sem causar grandes impactos com essa modificao. Sobre isto, Edson Gonalves catedrtico (GONAVES, 2007, p.512):
[...] O Hibernate se integra suavemente ao seu sistema se comunicando com o banco de dados como se fosse diretamente feito por sua aplicao. Uma mudana no banco de dados, nesse caso, no se torna traumtica, alterando apenas um ou outro detalhe nas configuraes do Hibernate.

S isto j considerado uma grande evoluo. Mas existem outras tecnologias que surgiram para aperfeioar ainda mais este processo. Estou me referindo ao framework Spring e as prprias inovaes da JPA (Java Persistent API) que o Hibernate implementa.

25

3.2 3.2.1

JPA O que JPA?

JPA (Java Persistence API) um framework utilizado na camada de persistncia a dados cujo propsito principal a facilitao por parte da equipe de desenvolvimento, no que tange complexidade da arquitetura em si. Traz uma maior produtividade, uma vez que se pode utilizar a tecnologia para a realizao de muitas tarefas julgadas difceis e complexas, em um momento anterior. Edson Gonalves, em seu ltimo trabalho publicado sobre o assunto, postulou o seguinte (GONALVES, 2008, p.79):
[...] Porm, com o Java EE 5, atravs da especificao do EJB3, na introduo da JPA (Java Persistence API), ficou muito popular o uso de JP-QL, Java Persistence Query Language, onde o mapeamento de objeto/relacional foi padronizado na plataforma Java. Com isso, o ORM Hibernate passou a ser um provedor de persistncia que, se for necessrio, pode ser substitudo por outro sem que ocorram mudanas na comunicao entre aplicao e o ORM.

Como se pode observar na figura 16, a JPA apenas uma especificao e necessita de outros frameworks para implement-la. Os dois mais utilizados so o Hibernate e o TopLink.

Figura 16 Java Persistence API.

26

3.2.2 3.2.2.1

Mapeamento Objeto-Relacional (ORM) Conceito

Segundo o Wikipdia, Mapeamento Objeto-Relacional :


[...] uma tcnica de desenvolvimento utilizada para reduzir a impedncia da programao orientada aos objetos utilizando bancos de dados relacionais . As tabelas do banco de dados so representadas atravs de classes e os registros de cada tabela so representados como instncias das classes correspondentes.

Um banco de dados relacional de alto gabarito fundamental em qualquer aplicativo que tenha a pretenso de guardar dados, e os profissionais de software devem comear a sua elaborao j sabendo qual banco iro utilizar aps a realizao da arquitetura, moldada em intensivos trabalhos de anlise. No obstante, um projeto de banco de dados (modelagem perfeita) surge sempre do resultado de um criterioso trabalho dos profissionais de requisitos os Analistas de Requisitos. Aps isto, iro pensar na melhor forma de modelar os dados, onde entraria o SGBDR (Sistema Gerenciador de Banco de Dados Relacional), j prdefinido. O processo de modelagem das classes envolvidas em um ambiente de programao Java deve sempre levar em conta os dados que iro ser persistidos em um banco de dados relacional, como j mencionado aqui. Deve-se tambm observar o tipo de framework a ser utilizado para a realizao da persistncia desses dados. No caso, iremos utilizar o Hibernate e a JPA (Java Persistence API) neste processo. Note-se que o prprio nome da classe pode influenciar a maneira como se configura os mapeamentos. Projetam-se as classes de acordo com os aspectos fundamentais considerados pelo Hibernate/JPA. Algo tipo assim: Um departamento possui uma coleo de funcionrios.

Departamento

Funcionarios

27
Figura 17 Associaes.

3.2.2.2

Um modelo a ser mapeado

Considere a figura 18. Isto um trabalho especfico de projetista. Algum raciocnio lgico foi utilizado para se chegar a uma soluo final. Todos os dados foram extrados de uma documentao gerada em longos dias de anlise. O diagrama apresenta apenas as entidades de domnio, pois so elas que nos interessam sob o ponto de vista do mapeamento OR (Objeto/Relacional). Com este modelo, possvel obter informaes a respeito de um funcionrio, por exemplo, qual departamento em que ele trabalha, qual seu endereo, quais as suas especializaes, etc.; no que tange ao departamento, possibilita obter uma relao dos funcionrios que trabalham no Departamento de Recursos Humanos, por exemplo. Enfim, as possibilidades so inmeras.

28
Figura 18 Exemplo de objetos que podem ser mapeados.

O que preciso fazer para Que este modelo funcione? Obviamente, aps a criao do projeto em si, devero ser criadas as classes Java responsveis pela execuo do aplicativo e um banco de dados relacional, em seguida, utilizando as anotations, mapeia-se os objetos e seus atributos para o banco de dados escolhido, tomando o cuidado para que cada atributo seja mapeado para o campo correto das tabelas do referido banco.

3.2.2.3

Cardinalidade entre entidades

Segundo o Wikipdia, [...] Cardinalidade, em teoria dos conjuntos, uma forma de medir a quantidade de elementos de um conjunto. (WIKIPDIA, www.wikpedia.org). Em banco de dados, expressa o comportamento de uma ocorrncia em determinada entidade associada a uma ou mais ocorrncias de uma outra entidade atravs de um relacionamento. Relacionamento: a relao existente entre duas entidades, tambm chamada Associao. [...] A essncia de qualquer banco de dados relacional est na possibilidade de poder relacionar suas diversas tabelas. Este procedimento tem por objetivos evitar a redundncia de dados [...] (OLIVIERO, 2002, p.32). Esta relao pode ser: Um para Um (1 : 1); Um para Muitos (1 : *); Muitos para Muitos (* : *). Oliviero ainda diz (OLIVIERO, 2002, p.35):
[...] Sempre que estabelecemos um relacionamento entre duas tabelas, uma delas ser denominada Pai e a outra Filha. A tabela Pai aquela que contm a chave primria e a tabela Filha aquela que contm a chave estrangeira. Basicamente existem trs

29
tipos de relacionamentos entre tabelas: um-pa-muitos, muitos-paramuitos e um-para-um.

Relao 1 : 1 De acordo com o modelo proposto na figura 18, a relao 1:1 pode ser evidenciada entre as entidades Funcionario e Endereco. Abaixo, na figura 19, temos uma anlise mais apurada desta relao.

Um funcion rio possui um nico endere o.

Em uma relao assim, um funcionrio s poder ter apenas UM endereo, ou NENHUM endereo. Da mesma forma que no poderia existir um endereo SEM funcionrio. Ento possvel que um funcionrio no possua endereo, mas, o dia em que ele vier a possuir, s poder possuir UM.

Figura 19 Exemplo de relao 1 : 1.

Relao 1 : * A relao 1 : * o tipo de relao mais encontrada em um modelo, digamos, 80% dos casos. Quando mapeada para um banco de dados relacional, ns costumamos chamar a relao de PAI-FILHA ou MESTRE-DETALHE. No nosso modelo, esta relao est evidenciada entre as entidades Departamento e Funcionario. A figura 20 ilustra com maiores detalhes:
0..* funcionarios O zero indica que um departamento pode no ter nenhum (zero) funcionario. O asterisco quer dizer mnimo de 1 ou vrios funcionarios (*). Na totalidade, diramos que a relao entre Departamento e Funcionario que UM DEPARTAMENTO PODE TER ZERO OU VRIOS FUNCIONARIOS. 1..1 Mnimo de 1 (um) departamento e mximo de 1 (um) departamento. Ou seja um funcionario s poderia pertencer a UM departamento, e no dois. Da mesma forma que no poderia existir um funcionario SEM departamento.

Um departa mento possui uma coleo de endere os, ou nenhum endere o.

30
Figura 20 Exemplo de relao 1 : *.

Relao * : * A relao * : * o tipo de relao mais complexa e pouco utilizada em um modelo, digamos, uns 8% dos casos. Quando mapeada para um banco de dados relacional, exigir uma terceira tabela intermediando as duas. No nosso modelo, esta relao est evidenciada entre as entidades Funcionario e Especializacao.

Vrios funcionrios da empresa podem possuir vrias especializaes (vrios cursos de especializao), mas tambm possvel encontrar um funcionrio sem nenhuma especializao (veja que mnimo de zero). Por outro lado, no rol de especializaes da empresa, podemos encontrar vrios funcionrios, ou seja: Vrias especializaes possuem vrios funcionrios. Mas tambm possvel encontrar uma especializao que ainda no possua um funcionrio (imagine que a empresa possua um cargo de funileiro mas no h ainda um funcionrio com esta especializao). Este tipo de relao nos possibilita: Saber dos funcionrios, quais especializaes eles possuem; Saber das especializaes, quais funcionrios esto habilitados.

Vrios funcionrio s possuem vrias especializa ese viceversa.

Figura 21 Exemplo de relao * : *.

3.2.2.4

Mapeando para o banco de dados

Edson Gonalves tece algumas informaes sobre JPA (GONAVES, 2008, p.101):
[...] Na JPA, os objetos persistentes so denominados entidades (Entities). Uma entidade um objeto (POJO), que representa um conjunto de dados persistidos no banco. Como entidades so definidas por classes Java comuns, sem relao com frameworks ou bibliotecas, elas podem ser abstratas ou herdar de outras classes, sem restries.

Inicialmente, para que a JPA soubesse como carregar e armazenar objetos de classes persistentes era utilizado apenas arquivos de mapeamentos XML. Dessa forma, era possvel informar qual tabela do banco de dados se refere a uma dada

31

classe persistente e quais colunas na tabela so referentes a quais atributos da classe. Com o surgimento das anotaes no Java 5.0, tornou-se possvel substituir os arquivos XML para o mapeamento objeto relacional. Atravs do uso de um conjunto de anotaes no cdigo fonte das classes mapeadas. [...] As anotaes foram introduzidas a partir do Java SE 5 e atualmente fazem parte do Java EE 5, em especial do EJB3. (GONAVES, 2008, p.102). A figura 22 mostra o banco de dados completo, proposto para o modelo da figura 18. Em seguida, segue-se uma descrio sucinta de como mape-lo para os objetos persistentes (POJOs).

Figura 22 Banco de dados a ser mapeado pelo modelo proposto na figura 25.

Para o mapeamento com anotaes das entidades, sero utilizadas tanto anotaes do pacote javax.persistence.*, como do pacote org.hibernate.annotations.*. Considere a figura 23. Todas as classes persistentes mapeadas com anotaes so declaradas usando-se a anotao @Entity, aplicada em nvel de classe. Observa-se que com o uso de

32

anotaes, no h mais a necessidade de se utilizar arquivos de mapeamento XML adicionais. Quando o nome da classe diferente do nome da tabela para a qual mapeada necessrio informar na anotao @Table qual o nome da tabela, usando o atributo name. No entanto, podem-se mapear mesmo quando os nomes forem iguais, sem prejuzo do funcionamento, como pode se notar na figura. Como a tabela pertence a um esquema do banco de dados (anotaes), no mapeamento da classe, tambm necessrio informar em que esquema a tabela mapeada se encontra, utilizando o atributo schema da anotao @Table. No caso, a linha do cdigo fonte @Table(name="FUNCIONARIO", schema="public") est informando o nome e o esquema da tabela para a qual est mapeada a classe Funcionario. A chave primria da tabela mapeada na classe atravs da anotao @Id. O valor atribudo chave primria pode ser dado tanto pela aplicao quanto por um mecanismo da JPA/Hibernate que o gere automaticamente. A anotao @GeneratedValue permite a definio automtica para o valor do identificador. Neste caso, utilizou-se a estratgia a partir de uma seqncia, como feito na linha de cdigo @GeneratedValue(strategy = GenerationType. AUTO). Dessa forma, na hora de persistir uma linha na tabela aluno, a JPA/Hibernate vai pegar como valor para a chave primria o prximo valor disponvel por uma seqncia padro chamada func_seq. Deve-se salientar que o programador dever criar uma seqncia com este nome na base de dados referente tabela FUNCIONARIO. Ainda em relao ao identificador, quando o nome da coluna mapeada diferente do nome do atributo, necessrio utilizar a anotao @Column informando o nome da coluna, atravs do atributo name. No exemplo, o nome da coluna mapeada para o identificador (em cada tabela) ID, mapeada da seguinte forma: @Column(name="ID"). No caso seria dispensada esta anotao, pois o nome do

33

atributo da classe igual ao da coluna da tabela, mas no h problemas em us-la, mesmo que os nomes sejam iguais (foi usado aqui a ttulo de padronizao).

@Entity (name="Departamento") @SequenceGenerator(name = "dep_seq", sequenceName = "dep_seq") @Table (schema="public", name="DEPARTAMENTO") public class Departamento { @Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "dep_seq") private Long id; private String nome; private String chefe; @OneToMany(targetEntity=Funcionario.class, mappedBy="funcionario") private Collection<Funcionario> funcionarios; //getters/setters } @Entity (name="Endereco") @SequenceGenerator(name = "end_seq", sequenceName = "end_seq") @Table (schema="public", name="ENDERECO") public class Endereco{ @Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "end_seq") private Long id; private String rua; private String numero; private String bairro; private String cidade; private String uf; private String cep; private String telefone; @OneToOne(mappedBy="endereco", cascade=CascadeType.ALL) private Funcionario funcionario; //...getters/setters

@Entity (name="Especializacao") @SequenceGenerator(name = "esp_seq", sequenceName = "esp_seq") @Table (schema="public", name="ESPECIALIZACAO") public class Especializacao { @Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "esp_seq") private Long id; private String nome_curso; private Date data_inicio; private Date data_termino; private String instituicao_ensino; @ManyToMany( cascade=CascadeType.ALL, fetch = FetchType.LAZY) @JoinTable( name="FUNCIONARIO_ESPECIALIZACAO", joinColumns=@JoinColumn(name="ID"), inverseJoinColumns=@JoinColumn(name="ID") ) private Collection<Funcionario> funcionarios; //getters/setters

@Entity (name="Funcionario") @SequenceGenerator(name = "func_seq", sequenceName = "func_seq") @Table (schema="public", name="FUNCIONARIO") public class Funcionario { @Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "func_seq") private Long id; private String nome; private String cpf; private byte[] foto; @Column(name=DATA_ADMISSAO) private Date dataAdmissao; @OneToOne(mappedBy="funcionario", cascade=CascadeType.ALL) private Endereco endereco; @ManyToOne(targetEntity = Departamento.class) private Departamento departamento; @ManyToMany( cascade=CascadeType.ALL, fetch = FetchType.LAZY) @JoinTable(name="FUNCIONARIO_ESPECIALIZACAO", joinColumns=@JoinColumn(name="ID"),

34
inverseJoinColumns=@JoinColumn(name="ID") ) private Collection<Especializacao> especializacoes; //getters/setters

Figura 23 Mapeamento OR.

3.2.3

EntityManager: O corao da JPA

3.2.3.1 JPA, EJB, Hibernate. E agora?


No tpico anterior foi dito que a JPA uma especificao e necessita de outras tecnologias para implement-la. O Hibernate e o Toplink so essas tecnologias. Hoje em dia podemos utilizar estas duas tecnologias de vrias maneiras e ambas podem utilizar o EJB 3 (Enterprise Java Beans). Edson Gonalves explica bem o que vem a ser EJB (GONLAVES, 2007, p. 544):
[...] O EJB ou Enterprise Java Beans um componente servidor que roda em um container para EJB do servidor de aplicao. Considerado como um dos principais componentes da plataforma Java EE (Java Enterprise Edition), o EJB tem como principais objetivos da tecnologia fornecer rpido e simplificado desenvolvimento de aplicaes Java baseadas em componentes, distribudas, transacionais, seguras e portteis.

Como dito, podemos empregar o Hibernate ou o Toplink de vrias maneiras, combinando o Hibernate e a JPA, pois no existe uma forma padro de se fazer isto, bastando experincia e imaginao do desenvolvedor. Combinando Hibernate e JPA, ns sempre utilizamos: Uma classe chamada EntityManager o EJB trabalhando materializado dentro da biblioteca ejb3-persistence.jar; Anotaes especficas da JPA, novamente o EJB; Criterias/Restrictions, que so a menina dos olhos do Hibernate;

35

Um arquivo XML utilizando uma conexo do Hibernate, j que ele o implementador. NamedQueries, que nada mais so que anotaes de implementao da SQL. As NamedQueries e as Criterias/Restrictions so utilizadas para a realizao de consultas onde o retorno uma lista de objeto e no podem ser usadas ao mesmo tempo. Mas, como o dao que ser descrito mais adiante genrico, o programador poder fazer a sua prpria escolha. Fora isto, pode-se usar s JPA, nos casos de persistncias do tipo create, delete, update e busca pela chave primria. Resumindo: A prxima verso da JPA ir trazer o que o Hibernate tem de melhor, as Criterias/Restrictions. Assim sendo, do Hibernate s iremos aproveitar a conexo e as outras funcionalidades com respeito a cache e pool de conexes. Mas isto mera especulao, pois o que mais poderamos esperar do Hibernate no futuro?

3.2.3.2.

Gerenciador de Entidades

Nas diversas aplicaes existentes, sempre que for necessrio propagar o estado de um objeto que est em memria para o banco de dados ou vice-versa, h a necessidade de que a aplicao interaja com uma camada de persistncia. Com a API JPA, isso feito invocando o gerenciador de persistncia, tambm conhecido como gerenciador de entidades (EntityManager), responsvel por quase todas as operaes de persistncia de objetos. Um outro conceito tambm relacionado a esta especificao o de contexto persistente (PersistenceContext), que uma rea de memria onde os objetos persistentes se encontram. Quando se interage com o mecanismo de persistncia, necessrio para a aplicao ter conhecimento sobre os estados do ciclo de vida da persistncia. Em aplicaes orientadas a objetos, a persistncia permite que um objeto continue a existir mesmo aps a destruio do processo que o criou. Na verdade, o que

36

continua a existir seu estado, j que pode ser armazenado em disco e ento, no futuro, ser recriado em um novo objeto. O clico de vida de uma entidade pode ser constitudo por quatro estados: new, managed, removed e detached, como mostrado na Figura 24.

Figura 24 Ciclo de vida de objetos persistentes.

3.2.3.3.

Ciclo de vida dos objetos persistentes

Objetos New: so objetos em que as suas instncias no esto nem estiveram associadas a algum contexto persistente. Eles so instanciados, utilizados e aps a sua destruio no podem ser reconstrudos automaticamente. Objetos Managed: so objetos em que as suas instncias esto associadas a um contexto persistente, ou seja, tem uma identidade de banco de dados. Objetos Detached: so objetos que tiveram suas instncias associadas a um contexto persistente, mas que por algum motivo deixaram de ser associados, ou por fechamento da sesso (mais comum) ou outro motivo qualquer. Objetos Removed: so objetos que esto marcados para serem apagados do banco de dados no final de uma transao.

37

Inicio: O aplicativo pode criar ou utilizar um objeto. Se ele CRIA O objeto ficar imediatamente em estado new.

Departamento departamento = new Departamento();

//Aqui o objeto new, pois ainda no foi associado um contexto persistente. O EntityManager ainda no conhece este objeto.

entityManager.persist(departamento);

//Neste instante o objeto se tornou managed. Perceba que o mtodo persist utiliza objetos new.

Figura 25 Persistindo objetos com o entityManager.

Se ele UTILIZA S utiliza um objeto que esteja em estado managed, ou seja, que j exista no banco de dados. So os mtodos de consulta ao banco, como por exemplo find, list, etc.

entityManager.find(Departamento, 1); //Esta instruo busca um departamento que possua um id = 1. Neste instante o objeto recuperado passar a managed e assim permanecer, at que a sesso com o banco seja fechada, caso em que ele passar ao estado de detached.

Figura 26 Pesquisando objetos persistentes com o entityManager.

Trmino: Os objetos so coletados pelo Garbage Collector. Ns vimos como funciona os mtodos persist (salvar) e as consultas (find, list). E os mtodos remove e merge? Como funcionam? Analisando novamente a figura 24, percebemos que o mtodo remove s utiliza objetos manageds. Ento, no adiantaria simplesmente realizar isto (figura 27):

Departamento departamento = new Departamento(); //instancia o objeto. No momento seu estado new. departamento.setId(1); //Atribui o id = 1 (queremos apagar o departamento que possua um id=1). entityManager.remove(departamento); //Nada ir ocorrer aqui. Porque?

Figura 27 Suposto delete com o entityManager.

38

Em qual instante o objeto departamento acima se tornou managed? Veja que o mtodo remove necessita de um objeto em estado managed e coloca este mesmo objeto em estado removed, aps a operao. por isto que as instrues acima no funcionam, pois o objeto departamento no est managed. Como fazer para resolver a situao? Basta utilizar o mtodo merge do EntityManager. Abaixo (figura 28), as mesmas instrues usando o mtodo merge intermediando a operao:
Departamento departamento = new Departamento(); //instancia o objeto. No momento seu estado new. departamento.setId(1); //Atribui o id = 1 (queremos apagar o departamento que possua um id=1). departamento = entityManager.merge(departamento); //O mtodo merge em ao o objeto fica managed. entityManager.remove(departamento); //Agora sim, o departamento ser marcado para ser excludo ao final da transao (quando houver um commit), entrando em um estado removed.

Figura 28 delete com o entityManager.

E o mtodo merge? O mtodo merge funciona analogamente a um mtodo update qualquer. Na realidade, o EntityManager no possui um mtodo update declarativamente, o prprio merge que faz este servio.
Departamento departamento = new Departamento();//instancia o objeto. No momento seu estado new. departamento.setId(1); //deseja-se alterar os dados do departamento que possua um id=1.

departamento = entityManager.merge(departamento); //Este mtodo tenta buscar o objeto que possua um id=1 dentro do espao chamado detached. Pode ser que este objeto exista ali dentro. Se encontr-lo, ele ser trazido para managed. Se no encontr-lo ser criado dentro de managed. Dissemos que este objeto agora est gerenciado, ou seja, perfeitamente sincronizado com o banco de dados. departamento.setNome(Este nome foi alterado); //Agora que o objeto est detached, podemos alterar o seu estado. Todas as mudanas sero refletidas no banco de dados. Tudo isto muito semelhante aos mtodos updates da vida (alterar um registro no banco de dados). Se voc fizer uma pesquisa deste objeto (id=1) ele ficar managed. Da, nem precisa dar um merge, basta apenas um persist.

Figura 29 delete com o entityManager.

39

Isto mesmo diferente de tudo o que se possa ver por a no mundo da programao! Afinal o que mesmo este mtodo merge? Perceba no grfico da figura 24 duas setas pontilhadas. Isto indica que os objetos detached ou removed podem ser destrudos pelo Java a qualquer momento. Isto sinal de que PODE SER QUE ESTES OBJETOS AINDA ESTEJAM NA MEMRIA do EntityManager, ou em estado detached, ou em estado removed. No caso de um remove, foi necessrio colocar o objeto em estado managed, antes de ocorrer a deleo. Imagine que voc esteja querendo apagar do banco de dados um registro que possua um id=1, por exemplo. Ser que, ao submeter este objeto para o ciclo da persistncia, em algum momento, este objeto j no esteja na memria do EntityManager, em estado detached? Ser que este objeto de id=1 j no estava detached? Guardado l h algum tempo, desde que voc comeou a manipular o aplicativo? Pois . para isto que serve o merge. Ele tenta descobrir se este objeto est detached, caso ele esteja, ir devolver este objeto em estado managed.

3.2.3.4.

Pool de conexes

Uma das primeiras coisas que se pode fazer para dar incio construo do bloco persistente de um sistema qualquer a criao de um conector com banco de dados, que no caso de se estar utilizando JPA/Hibernate, pode ser materializado por um arquivo chamado persistence.xml, o qual pode, e deve, ser criado dentro da pasta src/META-INF do contexto da aplicao, seja Web ou Desktop. Este arquivo previsto pela especificao EJB 3 e, basicamente, deve-se configurar: A URL de conexo com o banco de dados; Usurio e senha;

40

Nmeros mximo e mnimo de conexes no pool (utilizando c3p0 ou outra tecnologia de pool de conexes compatvel com JPA/Hibernate);

Dialeto do banco de dados a ser utilizado.

Quando o nmero de usurios relativamente grande, cada vez que uma requisio feita, o servidor abre uma conexo com o banco e fecha-a ao final, o que pode deixar o sistema lento. Foi pensando neste problema que inventaram o pool de conexes. Segundo Jos Carlos Macoratti, proeminente profissional de TI que mantm um blog muito requisitado na internet, em um de seus artigos (MACORATTI, 2005, http://imasters.uol.com.br):
[...] A tcnica do Connection pooling permite a uma aplicao reusar conexes que existem em um pool ao invs de repetidamente fechar e criar novas conexes. Isto pode aumentar significativamente o desempenho e a escalabilidade das aplicaes, pois permite que um menor nmero de conexes atenda as requisies por conexes de uma aplicao visto que todas as conexes j esto prontas e criadas no pool a espera de serem utilizadas.

Uma Connection Pool uma camada que fica entre o cliente e o banco de dados. A finalidade deste pool evitar a lentido do aplicativo em caso de mltiplas conexes. Mas como isto se d? Muito simples: Quando o cliente abre uma conexo usando o pool, ao invs de abrir uma nova conexo, este simplesmente pega uma das conexes que ele j mantinha aberta com o banco e a marca como alocada para aquele cliente. O cliente ento usa a conexo normalmente e faz as operaes desejadas no banco. Quando ele fechar a conexo usando o pool, este no fecha a conexo com o banco. Ao invs disso, mantm a mesma aberta, mas a marca como disponvel. O Hibernate pode usar o pool interno que j vem implementado dentro dele. Este suficiente para quando estamos desenvolvendo ou testando uma aplicao. Para rod-la em um ambiente de produo, contudo, no recomendvel o uso de uma implementao to simples de connection pool. necessrio algo mais robusto.

41

assim que usamos um pool de terceiros para o Hibernate, chamado C3p0, robusto o suficiente para um ambiente de produo e completamente indispensvel em uma aplicao corporativa.

3.2.3.5.

Gerenciamento de transaes com o EntityManager

Agora que conhecemos um pouco da classe EntityManager, conexes e pool de conexes, teremos condies plenas de entender como funciona o mecanismo de abrir e fechar sesses de persistncia a dados. Vimos que necessitamos de um pool de conexes para evitar a lentido do sistema e agora iremos nos ater sobre isto com mais aprofundamento (lembrando sempre que estamos abordando o corao do mecanismo de persistncia a dados). Para salvar os dados em um banco, no basta simplesmente executar as instrues hipotticas descritas na figura abaixo:

dao.delete(departamento_de_vendas); //Apaga o objeto departamento_de_vendas no banco de dados. dao.insert(departamento_de_marketing); //Insere o objeto departamento_de_marketing no banco de dados. Mas ateno: S inserir este objeto se o departamento_de_vendas for apagado.

Figura 30 Suposto cdigo de persistncia a dados.

evidente que estas instrues podero at funcionar, mas ser que os dados esto consistentes? Como controlar isto? Como garantir que as duas instrues imaginrias acima possam acontecer concomitantemente? H um artigo muito interessante sobre o assunto, escrito por Marcelo Elias Del Valle, para o site da Devmedia (DELL VALLE,www.devmedia.com.br):
[...] Uma transao, como j deve ser sabido por parte do leitor, uma unidade lgica de trabalho e deve seguir 4 princpios fundamentais: Atomicidade As operaes executadas dentro de uma transao devem ser executadas por inteiro (todas as operaes) ou nenhuma das operaes devem surtir efeito. Ou tudo, ou nada.

42
Consistncia A transao no deve afetar o estado de consistncia dos dados relacionados entre si no banco. Isolamento Transaes rodando em paralelo devem ser isoladas uma da outra, de forma que se duas transaes mexem num mesmo registro de uma mesma tabela, por exemplo, deve existir algum mecanismo que cuide do nvel de isolamento nesse acesso concorrente. Durabilidade As Transaes garantem que os dados gravados no so perdidos mesmo em caso de reincio ou falha no sistema.

Dentro de um mtodo transacional possvel encontrarmos operaes como as descritas na figura abaixo:

Try{ transaction.begin(); //Primeiramente, iniciamos uma transao. dao.delete(departamento_de_vendas); //Operaes com o banco de dados. dao.insert(departamento_de_marketing); //Operaes com o banco de dados. transaction.commit(); //Ratifica a operao.

}catch (Exception e){ transaction.rollback(); //Se houver erro, cancela a operao. throw new DaoException(e); //Captura a exceo em uma exception personalizada. }finally{ transaction.close(); } //havendo encerrada. erro ou no, a transao ser

Figura 31 Exemplo de transao com banco de dados.

Percebe-se a a enorme economia de cdigo e a reduo da complexidade utilizando JPA/Hibernate para a realizao de uma transao. Porm, com o surgimento do Java 5, a complexidade reduziu-se mais ainda e o cdigo, que antes era feito como na figura 37, reduziu-se a apenas uma nica linha, com uma simples anotao a nvel de classe no objeto do, algo como abaixo:
@Transactional(readOnly = true, propagation=Propagation.REQUIRED)

Mas a, utilizando outro framework, o Spring, trabalhando em conjunto com a JPA/Hibernate.

43

4 4.1

FERRAMENTAS IDE QUE SO FERRAMENTAS IDE?

Talvez a definio mais completa de uma IDE seja aquela existente no site www.wikipedia.org:
[...] IDE, do ingls Integrated Development Environment ou Ambiente Integrado de Desenvolvimento, um programa de computador que rene caractersticas e ferramentas de apoio ao desenvolvimento de software com o objetivo de agilizar este processo.

Contrariando o que alguns profissionais de TI poderiam dizer, as ferramentas do tipo IDE so extremamente teis e indispensveis em processos com vrios mdulos de programas, pois conduzem ganhos significativos no aspecto da produtividade. Na realidade, a tecnologia Java permite a confeco de software sem a utilizao de IDEs. Muitos programadores experientes defendem esta premissa, por no se prenderem a produtos de terceiros. Hoje ns podemos contar com vrias ferramentas que manipulam a linguagem Java, dentre elas, destacamos o NetBeans, da Sun, o JBuilder, desenvolvido pela Borland, o Eclipse, da IBM, o JDeveloper da Oracle, entre outros. As caractersticas e ferramentas mais comuns encontradas nas IDEs so:

Editor: Local destinado digitao de cdigo-fonte na linguagem suportada pela IDE (pascal no Delphi, php e java no Eclipse, etc.);

Compilador: Compila o cdigo-fonte do programa, editado em uma linguagem especfica e a transforma em linguagem de mquina;

44

Depurador: Excelente artifcio que o programador possui para descobrir locais de possveis erros no cdigo fonte, por um processo denominado debugar;

Modelagem: Criao do modelo de classes, objetos, interfaces, associaes e interaes dos artefatos envolvidos no. Gerao de cdigo: Caracterstica mais explorada em ferramentas CASE, a gerao de cdigo tambm encontrada em IDEs, contudo com um escopo mais direcionado a templates de cdigo comumente utilizados para solucionar problemas rotineiros. Todavia, em conjunto com ferramentas de modelagem, a gerao pode gerar todo ou praticamente todo o cdigo-fonte do programa com base no modelo proposto, tornando muito mais rpido o processo de desenvolvimento e distribuio do software;

Distribuio: Auxilia no processo de criao do instalador do software, ou outra forma de distribuio do mesmo, seja discos ou via internet.

Testes Automatizados: Realiza testes no software de forma automatizada, com base em scripts ou programas de testes previamente especificados, gerando um relatrio dos mesmos, assim auxiliando na anlise do impacto das alteraes no cdigo-fonte. Ferramentas deste tipo mais comuns no mercado so chamadas robs de testes.

Refatorao: Consiste na melhoria constante do cdigo-fonte do software, seja na construo de cdigo mais otimizado, mais limpo e/ou com melhor entendimento pelos envolvidos no desenvolvimento do software. A refatorao, em conjunto com os testes automatizados, uma poderosa ferramenta no processo de erradicao de "bugs", tendo em vista que os testes "garantem" o mesmo comportamento externo do software ou da caracterstica sendo reconstruda.

Neste trabalho veremos apenas a ferramenta Eclipse, visto ser ela a mais popular e tambm por ser ela a ferramenta utilizada para a construo do Dao Genrico um dos objetivos deste trabalho.

45

Segundo Edson Gonaves, em seu livro Dominando Eclipse (GONALVES, 2006, prefcio):
[...] O Eclipse vem se destacando cada vez mais por ser uma complexa, gratuita e ao mesmo tempo uma ferramenta de desenvolvimento multiplataforma.[...]

4.2 4.2.1

ECLIPSE Palavras iniciais

O ambiente Eclipse composto por um conjunto de ferramentas que permite a edio, compilao, depurao e documentao de produtos de software baseados na tecnologia Java. Desta forma, o desenvolvedor ter em um nico ambiente integrado todo um conjunto de ferramentas necessrias para a criao de suas aplicaes. Existem poucas literaturas em lngua portuguesa a respeito, unicamente, do Eclipse, em uma delas, Edson Gonalves frisa bem (GONALVES, 2006, p.21):
[...] O Eclipse uma IDE de desenvolvimento de programao, inicialmente desenvolvida pela IBM, que, segundo notcias, gastou mais de 40 milhes de dlares no seu desenvolvimento antes de transformar essa ferramenta em Open Source para um consrcio, chamado de Eclipse.org, que inicialmente incluiu a Borland, IBM, Merant, QNX Software Systems, Rational Software, Red Hat, SuSE, TogetherSoft e Webgain.

O Eclipse distribudo com um componente principal - o Eclipse SDK, que o ambiente bsico de trabalho, contendo os recursos fundamentais para o desenvolvimento Java padro. Os plugins so utilizados a fim de estender a funcionalidade do ambiente e acrescentar suporte a recursos e tecnologias especficas, tais como projetos-standalone (desktop) e projetos-web. [...] importante salientar que o Eclipse no o fora a trabalhar com seu Toolkit, a menos que voc queira fazer plug-ins, voc pode continuar programando em AWT e SWING normalmente [...] (GONALVES, 2006, p.24). O Eclipse e todos os seus plugins, por serem ferramentas totalmente desenvolvidas em Java puro, no necessitam instaladores, o que facilita um pouco as coisas, alm

46

de no despejar na mquina do usurio uma enorme quantidade de arquivos correlatos espalhados pelo sistema operacional do computador, como o fazem outros softwares por a. Esta IDE est disponvel no formato .zip, bastando descompactar o mesmo em qualquer local do computador.

4.2.2

A workbench

A Workbench (rea de trabalho) do Eclipse tambm pode ser customizada a gosto do desenvolvedor. As vises do Eclipse tambm podem ser modificadas, sendo esta uma tarefa que cada usurio poder executar por si s, clicando e arrastando vises, posicionando-as nos locais mais preferidos. Pode-se tambm mudar o idioma nativo, bastando para isto baixar o pacote de idiomas no site da fundao Eclipse. Existem vrios pacotes de idiomas que podero ser escolhidos, cuidando para que se faa o download do pacote que corresponda verso de Eclipse que se esteja utilizando e que contenha a linguagem pt_BR (portugus do Brasil), no caso. Este arquivo nada mais do que um plugin e para instal-lo s seguir as mesmas regras da instalao do Eclipse. A deciso de instalar ou no o pacote de linguagem fica por conta do gosto de cada um. No entanto, tal prtica no seria muito recomendada, visto que, apesar de alguma valia para os principiantes, a traduo no toda completa. Algumas partes ainda no foram traduzidas, o que tornaria a workbench uma miscelnea de linguagens.

4.2.3

Como so gerenciados os projetos

O Eclipse gerencia suas aplicaes por meio de um conceito de projeto. Um projeto de software uma estrutura hierrquica que organiza o contedo de uma aplicao atravs de uma estrutura de diretrios. Todo projeto dever possuir uma estrutura de diretrios.

47

Quando criamos uma classe, ela ser salva com a extenso . java. Ao salvar, o Eclipse imediatamente a compila gerando um arquivo com a extenso .class. conveniente armazenar os arquivos de extenses .class em uma pasta diferente da onde so armazenados os arquivos .java. Isto o que ns poderamos chamar de organizao do projeto. Tambm poderemos guardar outros arquivos que no sejam classes em outras pastas diferentes. Por exemplo, as imagens que utilizamos no projeto poderiam ser guardadas em uma pasta chamada imagens. E por a vai. O prprio Eclipse possui mecanismos de gerenciar essas tarefas de forma automtica. Existem vrias frmulas para isto e vai do gosto de cada programador. Algumas vezes, os locais de armazenamento das classes so impostas so regras fixas como o caso de um projeto web, por exemplo. Mas de uma forma geral, um projeto do tipo standalone, utilizando a tecnologia Swing, pode ter uma estrutura mais ou menos parecida com a da figura 32.

Figura 32 Estrutura de um projeto Java no Eclipse.

Tomando por base a figura 32, bemvindo o nome do projeto. O nome do projeto nada mais do que uma pasta simples. bin: Local de armazenamento das classes compiladas e arquivos de resources. Esta pasta criada automaticamente, junto com a criao do projeto. Para projetos web, ela dever ser excluda, dando lugar a uma outra pasta chamada classes. lib: Local onde so armazenadas as bibliotecas necessrias para o

funcionamento do projeto. src: Local onde armazenado o cdigo fonte do projeto mais os recursos utilizados. Entenda-se por cdigo fonte como tudo aquilo que voc digita

48

(produz) para o seu aplicativo. So os arquivos com a extenso .java, entre outros. Esses arquivos .java so armazenados na pasta java. Os outros recursos, tais como imagens, cones ou arquivos de configurao, so armazenados na pasta resources, e tambm fazem parte do cdigo fonte. Todos os arquivos colocados aqui so replicados na pasta bin, automaticamente. .classpath e .project so arquivos de configurao do Eclipse e so gerados por ele, mas podem ser moldados do nosso jeito, caso haja a necessidade.

4.2.4

O editor de cdigos

Sem sombra de dvidas, a Code Editor a viso mais utilizada pelos programadores, pois nela que so desenvolvidos os cdigos Java. Mas ao contrrio do que se possa imaginar, o trabalho com ela no to penoso assim, visto que existem enormes funcionalidades que ajudam na tarefa rdua da programao. A linguagem Java composta por milhares de instrues, decor-las seria o cmulo. neste sentido que a Code Editor pode ajudar o programador. Existem dois recursos pra l de fenomenais dentro dela, denominados Quick Fix e Code Assist. Estes so os dois recursos extremamente teis que servem para ajudar o programador a se lembrar dos comandos Java e para autocompletar o cdigo no momento da digitao, acelerando o processo.

49

5 5.1

FRAMEWORK - DAO GENRICO ARQUITETURA

Considere a figura 33 abaixo.

Figura 33 Arquitetura do Dao Genrico.

Um projeto de nome PERSISTENT-WORLD, calcado nas mais modernas tecnologias utilizadas em sistemas atuais. Nele, podemos observar a evidncia de alguns padres de projeto, tais como: MVC, Factory, DAO, Facade e Repository.

50

As camadas MVC esto bem definidas em pacotes, na cor rosa: MODEL, CONTROLLER e VIEW. Notam-se todos os objetos correspondentes a cada uma dessas camadas, bem dispostos ao longo do diagrama, como por exemplo, o objeto DAO, figurando na camada MODEL. [...] A Arquitetura de Camadas muito

utilizada para separar responsabilidades em uma aplicao moderna [...] (FRAGMENTAL, www.fragmental.com.br).
Segundo um artigo publicado pela Fragmental Tecnologia, MVC seria (FRAGMENTAL, www.fragmental.com.br):
[...] Uma aplicao Java EE tradicional, por exemplo, usa o modelo de 3 Camadas: Apresentao, Negcios e Persistncia. Na Camada de Apresentao esto todas as classes e demais artefatos (como pginas JSP) relacionados com a interao entre o usurio e a aplicao. A Camada de Negcios contm a modelagem do domnio do problema em classes de negcio e a Camada de Persistncia contm as classes com conhecimento sobre como persistir objetos no banco de dados (por exemplo, DAOs) [...].

No obstante, os objetos que compem o Dao Genrico esto dispostos dentro de um pacote chamado FRAMEWORK. Neste sentido, [...] As Camadas promovem

o encapsulamento (uma Camada no vai saber o que tem dentro da outra) e a coeso (componentes parecidos ficam no mesmo grupo). (FRAGMENTAL,
www.fragmental.com.br). Este pacote, na realidade, possui elementos intercalados nas camadas MODEL e CONTROLLER, da seguinte forma: MODEL: - DomainFactory; - AbstractDao; - DaoFactory; - DAO; - arquivo spring.xml.

CONTROLLER - Base Facade;

51

- Facade. Do ponto de vista do framework em si, este Dao Genrico se resume na elaborao e funcionamento dos objetos citados acima. Os demais objetos constantes do diagrama meramente foram inseridos ali a fim de propiciar a realizao dos testes, empacotamento e distribuio do framework.

5.2

VISO FSICA DOS PACOTES ENVOLVIDOS

Segundo Edson Gonalves, um DAO genrico pode ser perfeitamente concebido (GONALVES, 2008, p.135):
[...] Embora o DAO (Data Access Object) seja um padro que tem a finalidade de isolar o acesso a dados, a partir do Java 5, esse padro pode ser mais simplificado. Sabendo que os DAOs repetem determinados mtodos, o desenvolvedor pode isol-los e reutiliz-los, criando um DAO Genrico. Isso possibilita usar genericamente uma base para outros DAOs que o estendem, sem repetio de cdigo.

A figura 34 nos mostra como o projeto foi implementado utilizando a IDE Eclipse como ferramenta de trabalho.

Figura 34 Viso fsica do projeto utilizando a IDE Eclipse.

52

O arquivo spring.xml o responsvel por conectar esta tecnologia com todos os outros objetos persistentes da JPA/Hibernate. O arquivo log4j.properties o responsvel por imprimir no console, ou em um arquivo de log, todos os processos envolvidos, tais como, manipulaes realizadas no banco de dados, por intermdio das expresses SQL utilizadas, erros que possam ocorrer, etc.

5.3 5.3.1

ANLISE DAS CLASSES ENVOLVIDAS AbstractDao

A classe AbstractDao fornecer toda a interface do Dao Genrico, contendo todos os mtodos de acesso ao EntityManager. A figura 35 ilustra como isto pode ser feito:
@Repository @Transactional(readOnly = true, propagation=Propagation.REQUIRED) public abstract class AbstractDao<T> { @PersistenceContext(type=PersistenceContextType.EXTENDED) private static EntityManager entityManager; @PersistenceUnit(name = "persistent-world") private static EntityManagerFactory entityManagerFactory; @Transactional(readOnly = false,propagation=Propagation.REQUIRES_NEW) public abstract void insert(T obj) throws DaoException, Exception; public abstract T find(Class<T> t, Long pk) throws DaoException, Exception; public abstract List<T> list(String namedQuery) throws DaoException, Exception; @Transactional(readOnly = false,propagation=Propagation.REQUIRES_NEW) public abstract void executeNativeQuery(String nativeQuery, List<Object> params) throws DaoException, Exception; }

Figura 35 Fragmento da classe AbstractDao.

5.3.2

Dao

Esta classe implementa todos os mtodos da classe AbstractDao. Ento ela que realmente executa o trabalho, por assim dizer. Mas ainda necessita de uma fbrica para ela. A figura 36 mostra alguns mtodos implementados.
public class Dao<T> extends AbstractDao<T> { @Override public void insert(T obj) throws DaoException, Exception { try{

53
getEntityManager().persist(obj); }catch(Exception e){ getEntityManager().clear(); throw new DaoException(); }

public void refresh(Object obj) throws Exception{ if(getEntityManager().contains(obj)){ getEntityManager().refresh(obj); } } }

Figura 36 Fragmento da classe Dao.

5.3.3

DaoFactory

Esta classe a responsvel por disponibilizar um objeto dao para todo o aplicativo. A figura 37 mostra o seu aspecto na totalidade de seus mtodos. Perceba que existe um extenso comentrio, na verdade, este comentrio foi concebido no projeto original para compor o javadoc (documentao do projeto). Este comentrio explica como utilizar o framework utilizando o padro facade. Percebam que [...] A interface EntityManager a responsvel pelas operaes de persistncia [...] (GONALVES, 2008, p.141).

public class DaoFactory { @SuppressWarnings("unchecked") private static Dao dao; /** * Para utilizar o mtodo getDao()... * Este mtodo utilizado nas fachadas. * Uma fachada tpica, para uso com este framework: * * public class Facade implements IFacade { * * @SuppressWarnings("unchecked") * Dao dao = null; ; * * public void incluirVariosObjetos(Object... objetos) * throws PersistenciaException, NegocioException{ * * dao = new DaoFactory().getDao(); * * try { * dao.insert(objetos); * * }catch(DaoException e){ * throw new PersistenciaException(e.getMessage()); * * } catch (Exception e) { * throw new NegocioException(e.getMessage()); * } * * } * } * * Perceba que cada mtodo da fachada dever ter isto: * dao = new DaoFactory().getDao(); * */ @SuppressWarnings("unchecked") public Dao getDao() {

54
if(Dao.getEntityManager() == null){ dao = (Dao) new ClassPathXmlApplicationContext( "br/eti/amazu/persistentworld/framework/persistence/spring.xml") .getBean("dao"); } return dao; } }

Figura 37 Classe DaoFactory.

5.3.4

DomainFactory

Esta classe a responsvel por fabricar um objeto de domnio para ser persistido. A figura 38 mostra a classe DomainFactory e a figura 39 um exemplo de classe de domnio.

public class DomainFactory<T> { @SuppressWarnings("unchecked") public T getBean(String bean){ return (T) new ClassPathXmlApplicationContext( "META-INF/spring-injection.xml").getBean(bean); } }

Figura 38 Classe DomainFactory.


package br.eti.amazu.persistentworld.dominio.impl; // ...imports @Entity (name="Usuario") @SequenceGenerator(name = "usu_seq", sequenceName = "usu_seq") @Table (schema="public", name="USUARIO") @NamedQueries({ @NamedQuery( name="allUsuarios", query="select a from Usuario a order by a.nome" ), @NamedQuery( name="similarUsuarios", query="select a from Usuario a where a.nome like:param0" ), @NamedQuery( name="igualUsuario", query="select a from Usuario a where a.nome =:param0" ) }) public class Usuario implements IUsuario { @Id @GeneratedValue( strategy = GenerationType.AUTO, generator = "usu_seq" ) @Column (name="ID_USUARIO") private Long id; private String nome; private String senha; @Column (name="DATA_PRIMEIRO_ACESSO") private Date dataPrimeiroAcesso;

55
@Column (name="PRIMEIRO_ACESSO") private String primeiroAcesso; private String bloqueado; private Integer perfil; @ManyToOne( targetEntity = Pessoa.class ) @JoinColumn(name="ID_PESSOA") private Pessoa pessoa; // ...mtodos get/set }

Figura 39 Exemplo de classe de domnio.

Analisando a figura 39, pode-se observar uma srie de anotaes no topo da classe. Tais anotaes so bem prprias da JPA conforme observaes abaixo: @Entity: Informa o nome da prpria entidade, ou seja, da classe em si. @SequenceGenerator: Informa o nome da sequncia do banco de dados utilizado, isto , o mecanismo que o banco de dados utiliza para gerar uma nova linha na tabela em questo. @Table: O nome da tabela mapeada. @NamedQueries: Coleo das queries disponveis para uso no aplicativo.

5.3.5

DaoException

No importa qual programa esteja desenvolvendo, voc sempre dever tomar o cuidado de prever os possveis erros que seus cdigos possam gerar, durante a sua manipulao. O fato que erros sempre acontecem, s vezes por descuido do programador e outras por falha em alguma parte do sistema. Voc nunca est livre totalmente de erros, como prev Edson Gonalves (GONALVES, 2007, p.152):
[...] Como bem voc deve saber, uma aplicao nunca est totalmente imune a erros. Mesmo tendo resolvido um problema, outros tambm podem ocorrer. Um deles voc tentar dividir certo nmero por zero [...].

56

Os erros oriundos do programador so perceptveis e fceis de tratar, eis que no so consideradas excees, mas sim erros, no sentido da palavra. Neste caso no h nem mesmo o que o Java possa fazer para consertar. O prprio programador dever ter conscincia do local onde esteja errando e depurar o seu cdigo. Os erros oriundos do sistema que so mais difceis. As excees em Java alteram o fluxo normal do programa. Quando elas ocorrem, a execuo do programa transferida para um cdigo responsvel por trat-las. Este tratamento ir garantir a funcionalidade e o usurio ter o controle absoluto de suas operaes sobre o sistema que esteja manipulando. Por este motivo, o tratamento de excees de fundamental importncia. to importante que, em determinadas situaes dentro do cdigo, o tratamento obrigatrio e caso no o fosse no haveria compilao. Isto muito comum na programao com banco de dados usando a classe sql do Java. Em algumas ocasies o programador obrigado a lanar um tratamento de exceo para haver a compilao normal do programa. A preocupao maior sempre dever ser os erros causados por falhas no sistema.

public class DaoException extends Throwable { public DaoException(){ super(); } public DaoException(String message) { super(message); } public DaoException(Throwable cause) { super(cause); } public DaoException(String message, Throwable cause) { super(message, cause); } }

Figura 40 Classe DaoException.

public class InterceptorException { public Object checkPersistenciaException(ProceedingJoinPoint call) throws Throwable { Object o = null; try { o = call.proceed(); }catch(Exception e) { throw new DaoException(e); } } return o;

57
}

Figura 41 Classe InterceptorException.

Os erros de servidor podem ser considerados como excees Java (em tempo de execuo ou erros, ServletException ou subclasses, IOException e subclasses) ou pelos prprios cdigos HTTP, chamado de status (GONALVES, 2007, p.147).

5.3.6

CriteriaConfiguration

Como j mencionado anteriormente, no caso do experimento deste estudo, utilizamos o Hibernate apenas para a realizao de consultas do tipo list. Basicamente consta de uma expresso envolvendo uma srie de diretivas utilizando critrios de pesquisa em substituio s sentenas SQL. Isto o que bacana aqui. Pode-se realizar qualquer consulta ao banco de dados sem digitar uma linha de SQL sequer. Uma expresso assim:
query="select a from Departamento a where a.nome like:param0" query.setParameter("param0", "se")); //selecione todos os registros da tabela DEPARTAMENTO, //que possua em seu nome uma seqncia de caracteres "se". //Esta sentena SQL poderia nos devolver os seguintes registros:

Seo de informtica Seo de Manuteno Departamento de Servios Departamento de Vendas Outros Paises

Usando criteria, poderamos escrever a mesma sentena assim:

criteriaConfiguration.add(Restrictions.ilike("nome", "se", MatchMode.ANYWHERE));

A primeira impresso, para algum que no esteja acostumado, que isto parece ser mais complicado, mas na verdade no . Perceba que agora estamos lidando com objetos. Uma restriction chamada ilike, ir fazer o trabalho, passando o parmetro nome, que o nome do campo da tabela, o parmetro se e utilizando MatchMode.ANYWHERE, que significa desconsiderar maisculas e minsculas.

58

O primeiro passo em direo a isto ser a criao de uma classe chamada CriteriaConfiguration. Esta classe, na realidade, a prpria classe Criteria, do pacote org.hibernate com o acrscimo de um mtodo adicional. A figura 42 ilustra um fragmento desta classe. Basicamente consta de uma expresso envolvendo uma srie de diretivas utilizando critrios de pesquisa, em substituio s sentenas SQL. Isto o que bacana aqui. Voc ser capaz de realizar qualquer consulta ao banco de dados sem digitar uma linha de SQL sequer.
//...imports
public class CriteriaConfiguration { private static org.hibernate.Criteria criteria; public CriteriaConfiguration(){ } /** * Este o mtodo adicional criado por ns */ public static void setCriteria(org.hibernate.Criteria criteria) { CriteriaConfiguration.criteria = criteria; }

//daqui para baixo, reescrever os mtodos da classe original.


}

Figura 42 Fragmento da Classe CriteriaConfiguration.

5.3.7

Exemplo de uma Facade


//...imports
public class CursoFacade implements ICursoFacade { @SuppressWarnings("unchecked") Dao dao = null; ; @SuppressWarnings("unchecked") public void incluirCurso(ICurso curso) throws PersistenciaException, NegocioException{ dao = new DaoFactory().getDao(); try { dao.insert(curso);

}catch(DaoException e){ throw new PersistenciaException(e.getMessage()); } catch (Exception e) { throw new NegocioException(e.getMessage()); } } @SuppressWarnings("unchecked") public void excluirCurso(ICurso curso) throws PersistenciaException, NegocioException{ dao = new DaoFactory().getDao();

59
try { dao.delete(curso); }catch(DaoException e){ throw new PersistenciaException(e.getMessage()); } catch (Exception e) { throw new NegocioException(e.getMessage()); } }

//...daqui para baixo, outros mtodos


}

Figura 43 Exemplo de uma Facade.

5.4 5.4.1

OUTRAS CONFIGURAES spring.xml

A figura 44 mostra o arquivo spring.xml contendo tudo o que deve ser configurado.
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd" default-autowire="byName"> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="persistenceUnitName" value="persistent-world"/> <property name="jpaDialect"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/> </property> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="showSql" value="true"/> <property name="generateDdl" value="true"/> </bean> </property> </bean> <!-- Injeta a classe Dao --> <bean id="dao" class="br.eti.amazu.persistentworld.framework.persistence.dao.Dao"/> <!-- Injeta a fachada comum --> <bean id="facade" class="br.eti.amazu.persistentworld.framework.facade.impl.Facade"> </bean> <!-- Tramamento da exception no DAO --> <bean id="persistenciaException" class="br.eti.amazu.persistentworld.framework.persistence.exception.InterceptorException"/> <!-- Aspecto do tratamento de exception a nivel de DAO --> <aop:config> <aop:aspect ref="persistenciaException"> <aop:pointcut id="controlePersistenciaException" expression="execution(* *..dao.*Dao.*(..))" />

60
<aop:around pointcut-ref="controlePersistenciaException" method="checkPersistenciaException" /> </aop:aspect> </aop:config> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory"/> </bean> <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> <tx:annotation-driven transaction-manager="transactionManager" /> </beans>

Figura 44 Arquivo spring.xml.

5.4.2

log4j.properties
### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### direct messages to file hibernate.log ### #log4j.appender.file=org.apache.log4j.FileAppender #log4j.appender.file.File=hibernate.log #log4j.appender.file.layout=org.apache.log4j.PatternLayout #log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### set log levels - for more verbose logging change 'info' to 'debug' ### log4j.rootLogger=warn, stdout log4j.logger.org.hibernate=info

Figura 45 Arquivo log4j.properties.

5.4.3

persistence.xml

<?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="persistent-world"> <properties> <property name="hibernate.hbm2ddl.auto" value="none"/> <property name="hibernate.format_sql" value="true" /> <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/> <property name="hibernate.connection.driver_class" value="org.postgresql.Driver" /> <property name="hibernate.connection.url" value = "jdbc:postgresql://localhost:5432/persistentworld"/> <property name="hibernate.connection.username" value="postgres" /> <property name="hibernate.connection.password" value="postgres" /> <property <property <property <property name="c3p0.acquire_increment" value="1"/> name="c3p0.idle_test_period" value="100"/> name="c3p0.max_size" value="50" /> name="c3p0.max_statements" value="0" />

61
<property name="c3p0.min_size" value="1"/> <property name="c3p0.timeout" value="60"/> <property name="hibernate.cache.provider_class" value="org.hibernate.cache.OSCacheProvider"/> </properties> </persistence-unit> </persistence>

Figura 46 Arquivo persistence.xml.

5.4.4

spring-injection.xml

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd" default-autowire="byName"> <!-- Injeo de dependncia: todas as entidades de domnio --> <bean id="pessoa" class="br.eti.amazu.persistentworld.dominio.impl.Pessoa"> </bean> <!outros beans entram daqui para baixo...--> <!-- Injeo de dependncia: todas as fachadas --> <bean id="criteriaFacade" class="br.eti.amazu.persistentworld.facade.impl.CriteriaFacade"> </bean> <!outras fachadas entram daqui para baixo...--> </beans>

Figura 47 Fragmento do arquivo spring-injection.xml.

62

CONCLUSO
O presente Trabalho procurou sintetizar, embora em pouco espao, as principais tecnologias de ponta existentes no mundo da Tecnologia da Informao voltadas para o desenvolvimento de aplicativos. Focou como tema central, a preocupao dos profissionais de TI na perfeita elaborao de cdigo-fonte, por uma equipe bem treinada e especializada, cujo produto final fosse a reduo da complexidade dos mecanismos envolvidos. Tal reduo teria um efeito futuro, reduzindo custos com a manuteno e o reaproveitamento de cdigo. H muito que se dizer a respeito do assunto, pois apenas arranhamos a sua superfcie. Existem centenas de livros explicando os pormenores e, com certeza, h muito que se aprofundar. No entanto, considero que o que foi tratado, para um trabalho tpico como este, seja suficiente para se entender a dimenso e projeo do que venha a ser to importante segmento do ramo de TI. Eis que o assunto, claramente, no pde ser esgotado, o que seria praticamente impossvel, pois ele pode assumir aspectos complexos e sofisticados que acabariam por fugir do escopo. Necessrio se faz lembrar que uma equipe bem treinada no quer dizer que seus componentes tenham a necessidade de saber tudo, pois nem mesmo o melhor programador do mundo consegue isto. O bom profissional tem a obrigao de saber do que se trata tal cdigo, mas se no souber de cabea como implement-lo, pelo menos saber onde encontrar uma referncia sobre ele. Eu lembro, talvez agora por mais de uma vez, que a construo de programas robustos depende tambm da imaginao e destreza dos prprios profissionais envolvidos, no intuito de tentar

63

lembrar ou prever quais locais do cdigo, que poderiam ser melhorados e simplificados com o uso das ferramentas disponveis. Por ora, em face da percepo de o quanto melhorou muito as tecnologias, fica ainda aquela clssica pergunta no ar: O que mais vem por a?. A resposta pode ser obtida em uma simples pesquisa na Internet, muda a cada minuto...

64

REFERNCIAS BIBLIOGRFICAS

BARTI, Alexandre. Garantia da qualidade de software: Adquirindo maturidade organizacional. Rio de Janeiro: Elsevier, 2002. BAUER, Christian; KING, Gavin. Java Persistence com Hibernate. Rio de Janeiro: Cincia Moderna, 2007. CAELUM. Blog. Caelum, 2009. Disponvel em: <http://blog.caelum.com.br/2008/01/28/os-7-habitos-dos-desenvolvedores-hibernatee-jpa-altamente-eficazes/> CAVALIERI, A. (coord.); DINSMORE, P. C. Gerenciamento de Projetos Livro-Base de Preparao para Certificao PMP Project Management Professional. 2 ed. Qualitumark. CORREIA, Carlos Henrique; TAFNER, Malcon Anderson. Anlise orientada a objetos. 2. Edio. Florianpolis: Visual Books, 2006. DEITEL. JAVA como programar. 6 Ed. So Paulo: Pearson, 2005. DEVMEDIA. Cdigo aberto. DevMedia, 2009. Disponvel em: <http://www.devmedia.com.br/articles/viewcomp.asp?comp=5125> FRAGMENTAL. Blog. Fragmental Tecnologia, 2009. Disponvel em: <http://www.fragmental.com.br/wiki/index.php?title=MVC_e_Camadas> GONALVES, Edson. Dominando JavaServer Faces e Facelets Utilizando Spring 2.5, Hibernate e JPA. Rio de Janeiro: Editora Cincia Moderna, 2008. ______. Desenvolvendo Aplicaes Web com JSP, Servlets, Javaserver Faces, Hibernate, EJB 3 Persistence e Ajax. Rio de Janeiro: Editora Cincia Moderna, 2007. ______. Dominando Eclipse. Rio de Janeiro: Editora Cincia Moderna, 2006.

65

GUEDES, Gileanest T. A. UML, Uma abordagem prtica. So Paulo: Novatec, 2004. GUJ. Forum Java. GUJ, 2008. Disponvel em: <http://www.guj.com.br/article.show.logic?id=105 >. HYBERNATE. Cdigo aberto. Hybernate, 2009. Disponvel em: <http://docs.jboss.org/hibernate/stable/core/reference/en/html/> IBM. Gerenciamento de qualidade de software. IBM, 2008. Disponvel em: <http://www-142.ibm.com>. IMASTERS. Cdigo aberto. Imasters, 2009. Disponvel em: <http://imasters.uol.com.br/artigo/3033/dotnet/usando_connection_pooling/> MAGALHAES, I.V.; PINHEIRO W.B. Gerenciamento de Servio de TI na prtica. Uma abordagem com base na ITIL. So Paulo: Novatec, 2007. OHLOH. Open Source Projects. <http://www.ohloh.net/languages/compare> Ohloh, 2008. Disponvel em:

OLIVEIRO, Carlos A. J., Banco de Dados com Delphi 6 . So Paulo: Editora rica, 2002. SIERRA, Katie; Bates, Bert. JAVA Use a cabea. 2 Ed. Rio de Janeiro: Alta Books, 2005. WALLS, Craig; BREIDENBACK, Ryan. SPRING em Ao. Rio de Janeiro: Editora Cincia Moderna, 2006. WIKIPDIA. Enciclopdia virtual. Wikipdia, 2009. Disponvel em: <TTP://pt.wikipedia.org/wiki/Mapeamento_objeto-relacional)>. YOSHIDA, Paulino Shigueo; FRANCO, Cludio B. S. de Mendona. Universidade Java. So Paulo: Digerati Comunicao e Tecnologia Ltda, 2004.

Potrebbero piacerti anche