Jdo Ufpe
Jdo Ufpe
Jdo Ufpe
DE
PERNAMBUCO
TRABALHO DE GRADUAO
POR
ESTE TRABALHO FOI APRESENTADO GRADUAO DO CENTRO DE INFORMTICA DA UNIVERSIDADE FEDERAL DE PERNAMBUCO COMO REQUISITO PARCIAL PARA A CONCLUSO DO CURSO DE CINCIA DA COMPUTAO.
RECIFE, NOVEMBRO/2009
Agradecimentos
Nesses 4 anos de caminhada dentro da universidade, eu conheci muitas pessoas. Algumas passaram, outras ficaram, mas todas, de alguma forma, auxiliaram no meu desenvolvimento. Primeiramente eu gostaria de agradecer a Deus, pois sem Ele nada disso teria acontecido. Gostaria de agradecer a minha famlia, por sempre ter me apoiado, desde o incio da minha vida e em especial meus pais, pelos sacrifcios feitos para que eu pudesse chegar at aqui. Gostaria tambm de agradecer aos meus amigos e namorado que me acompanharam em todos esses anos, nas alegrias e tristezas da vida acadmica, compartilhando sorrisos e desesperos. Tambm no posso deixar de lembrar dos meus professores, que tanto me ensinaram todos esses anos, e que foram cruciais para o meu crescimento como pessoa e como profissional, e em especial a Robson, por ter me oferecido tantas oportunidades e por ter aceitado ser meu orientador, nessa tarefa rdua. Enfim, agradeo a todos que passaram pela minha vida e me ajudaram a ser quem eu sou hoje.
Resumo
Aplicaes de software geralmente tm que lidar com armazenamento de dados persistentes, onde ao final da execuo de um programa, os dados armazenados em memria RAM ficam persistidos em disco. Para a plataforma Java, h uma grande variedade de padres e solues proprietrias para realizar essa funo, tornando difcil a escolha da melhor soluo. Nesta plataforma de programao, a interface de conectividade, persistncia e programao com BD (Banco de Dados) mais difundida a JDBC (Java Database Conectivity). Alm de JDBC, atualmente existem outras propostas, como os frameworks Hibernate e TopLink, que diferente de JDBC, permitem persistir e manipular diretamente objetos Java ao invs de ter que mapear estes objetos em linhas e colunas de uma tabela relacional. Dessa forma, todo o trabalho de mapear, traduzir pesquisas, manipular objetos em SQL e conectividade com o BD passou a ser funo do framework de persistncia. Dado que existem vrias formas de mapear objetos para BD relacionais, foram desenvolvidas duas API (Application Programming Interface) com o objetivo de padronizar este mapeamento, a saber; JPA (Java Persistence API) e JDO (Java Data Objects). Assim, este trabalho foi desenvolvido com o objetivo de explicar, de forma prtica, cada uma dessas API e, ao final, fazer uma anlise comparativa entre elas. Palavras-chave: JPA, JDO, persistncia, mapeamento
Sumrio
1. Introduo................................................................................................................................. 9 1.1. Motivao .......................................................................................................................... 10 1.2. Objetivo ............................................................................................................................. 10 1.3. Exemplo Guia e Sistemtica de Estudo ............................................................................. 11 1.3.1. Esquema conceitual ....................................................................................................... 11 1.3.2. Sistemtica de Estudo .................................................................................................... 12 1.4. Estrutura do Trabalho ........................................................................................................ 13 2. Java Persistence API .............................................................................................................. 14 2.1. Conceitos bsicos de JPA .................................................................................................. 14 2.2. Exemplo Prtico ................................................................................................................ 15 2.2.1. Configurao do ambiente ............................................................................................. 15 2.2.2. Criao do Projeto ......................................................................................................... 16 2.2.3. Criao de Entidades ..................................................................................................... 17 2.2.4. Definindo o ORM .......................................................................................................... 18 2.2.4.1. Definir Tabelas e Colunas ......................................................................................... 18 2.2.4.2. Definir Herana ......................................................................................................... 20 2.2.4.3. Definir Atributo Composto e/ou Multivalorado ........................................................ 24 2.2.4.4. Definir Relacionamentos ........................................................................................... 25 2.2.4.4.1. Um-Para-Um ............................................................................................................. 25 2.2.4.4.2. Muitos-Para-Um ........................................................................................................ 27 2.2.4.4.3. Muitos-Para-Muitos ................................................................................................... 28 2.2.5. Definir Propriedades da Persistncia ............................................................................. 31 2.2.6. Trabalhar a Persistncia ................................................................................................. 33 2.2.6.1. Insero ...................................................................................................................... 34 2.2.6.2. Alterao.................................................................................................................... 34 2.2.6.3. Excluso..................................................................................................................... 35 2.2.6.4. Busca ......................................................................................................................... 35 2.3. Concluso .......................................................................................................................... 36 3. Java Data Objects ................................................................................................................... 37 3.1. Conceitos Bsicos de JDO................................................................................................. 37 3.2. Exemplo Prtico ................................................................................................................ 38 3.2.1. Configurao do ambiente ............................................................................................. 39 3.2.2. Criao do Projeto ......................................................................................................... 39 3.2.3. Criao de Entidades ..................................................................................................... 40 3.2.4. Definindo o ORM .......................................................................................................... 41 3.2.4.1. Definir Tabelas e Colunas ......................................................................................... 42 3.2.4.2. Definir Herana ......................................................................................................... 43 3.2.4.3. Definir Atributo Composto e/ou Multivalorado ........................................................ 47 3.2.4.4. Definir Relacionamentos ........................................................................................... 49 3.2.4.4.1. Um-Para-Um ............................................................................................................. 49 3.2.4.4.2. Muitos-Para-Um ........................................................................................................ 52 3.2.4.4.3. Muitos-Para-Muitos ................................................................................................... 52 4
3.2.5. Definir Propriedades da Persistncia ............................................................................. 56 3.2.6. Trabalhar a Persistncia ................................................................................................. 56 3.2.6.1. Insero ...................................................................................................................... 57 3.2.6.2. Alterao.................................................................................................................... 58 3.2.6.3. Remoo .................................................................................................................... 58 3.2.6.4. Busca ......................................................................................................................... 59 3.3. Concluso .......................................................................................................................... 59 4. Anlise Comparativa .............................................................................................................. 60 4.1. Consultas ........................................................................................................................... 63 4.2. Consideraes .................................................................................................................... 66 5. Concluso ............................................................................................................................... 67 5.1. Contribuies ..................................................................................................................... 67 5.2. Limitaes ......................................................................................................................... 68 5.3. Trabalhos Futuros .............................................................................................................. 68
Lista de Figuras
Figura 1 - Camada de Persistncia .................................................................................................. 9 Figura 2 - Esquema conceitual para o desenvolvimento do exemplo prtico ............................... 11 Figura 3 Classe bsica Pesquisador ............................................................................................ 17 Figura 4 Exemplo de chave primria composta ......................................................................... 19 Figura 5 Exemplo de chave primria nica e declarao de entidade ........................................ 19 Figura 6 Mapeamento da Entidade Pesquisador......................................................................... 20 Figura 7 Exemplo de herana [Dat09b]...................................................................................... 21 Figura 8 Herana SINGLE_TABLE [Jpo09] ............................................................................. 22 Figura 9 Herana JOINED [Jpo09] ............................................................................................ 22 Figura 10 Mapeamento TABLE_PER_CLASS [Jpo09] ............................................................ 23 Figura 11 Mapeamento de herana em Bolsista ......................................................................... 23 Figura 12 Mapeamento de herana em Pesquisador .................................................................. 24 Figura 13 Mapeamento de atributos compostos ......................................................................... 25 Figura 14 Mapeamento Um-Para-Um ........................................................................................ 26 Figura 15 - Mapeamento Um-Para-Um com entidade fraca ......................................................... 26 Figura 16 Mapeamento muitos-para-um .................................................................................... 28 Figura 17 Mapeamento muitos-para-muitos sem atributo na relao ........................................ 29 Figura 18 - Mapeamento em Artigo e Pesquisador de relacionamento M:N com atributo ........... 30 Figura 19 - Mapeamento na classe ArtigoPesquisador ................................................................. 31 Figura 20 Arquivo persistence.xml ............................................................................................ 32 Figura 21 Inicializando o EntityManager ................................................................................... 33 Figura 22 Inserindo um objeto.................................................................................................... 34 Figura 23 Alterando um objeto................................................................................................... 34 Figura 24 Removendo um objeto ............................................................................................... 35 Figura 25 Buscando um objeto ................................................................................................... 36 Figura 26- Definio do tipo de classe .......................................................................................... 40 Figura 27 Cabealho do arquivo de mapeamento ...................................................................... 41 Figura 28 Definio de identity-type .......................................................................................... 42 Figura 29 Mapeamento de atributos das classes ......................................................................... 43 Figura 30 Herana new-table [Dat09b] ...................................................................................... 44 Figura 31 Herana subclass-table [Dat09b]................................................................................ 45 Figura 32 Mapeamento de Produto ............................................................................................ 46 Figura 33 Herana superclass-table [Dat09b] ............................................................................ 46 Figura 34 Mapeamento de herana ............................................................................................. 47 Figura 35 Atributo Multivalorado [Spe09] ................................................................................. 47 Figura 36 Mapeamento de atributo multivalorado [Spe09]........................................................ 48 Figura 37 Atributo multivalorado composto [Spe09]................................................................. 48 Figura 38 Mapeamento de atributo multivalorado composto [Spe09] ....................................... 49 Figura 39 Mapeamento de relacionamento um-para-um ............................................................ 49 Figura 40 - Mapeamento de entidades fracas em relacionamentos 1:1 ......................................... 50 Figura 41 - Declarao da chave primria na entidade fraca ........................................................ 51 Figura 42 Mapeamento muitos-para-um .................................................................................... 52 Figura 43 Mapeamento muitos-para-muitos sem atributos no relacionamento ......................... 53 6
Figura 44 Mapeamento de Pesquisador e Artigo em relacionamento M:N com atributos ......... 54 Figura 45 - Mapeamento de ArtigoPesquisador ............................................................................ 54 Figura 46 - Classe ArtigoPesquisador ........................................................................................... 55 Figura 47 Arquivo de configurao da base de dados ................................................................ 56 Figura 48 Criando classes para persistncia ............................................................................... 57 Figura 49 Exemplo de insero .................................................................................................. 57 Figura 50 Exemplo de Atualizao ............................................................................................ 58 Figura 51 Exemplo de remoo .................................................................................................. 58 Figura 52 Exemplo de busca ...................................................................................................... 59 Figura 53 - Tipos suportados por JDO e JPA [ASF09b] ............................................................... 60 Figura 54 - Estrutura das consultas de JPQL e JDOQL [Dat09c] [KS06] .................................... 62 Figura 55 Consulta 1 com JDO .................................................................................................. 63 Figura 56 Consulta 1 com JPA ................................................................................................... 63 Figura 57 Consulta 2 com JDO .................................................................................................. 63 Figura 58 Consulta 2 com JPA ................................................................................................... 64 Figura 59 Consulta 3 com JDO .................................................................................................. 64 Figura 60 Mapeamento de atributos ........................................................................................... 64 Figura 61 Consulta 3 com JPA Exemplo 1.............................................................................. 65 Figura 62 Consulta 3 com JPA Exemplo 2.............................................................................. 65 Figura 63 - Consulta 4 com JDO ................................................................................................... 66 Figura 64 - Consulta 4 com JPA.................................................................................................... 66
Lista de Quadros
Quadro 1 - Regras para mapeamento de entidades [HGR09] ....................................................... 20 Quadro 2 - Atributos do mapeamento um-para-um [Sil08] .......................................................... 27 Quadro 3 - Atributos da coluna do relacionamento [Sil08]........................................................... 27 Quadro 4 - Implementaes de JDO [ASF09a] ............................................................................. 38
1. Introduo
Este trabalho faz um estudo de duas API (Application Programming Interface) de persistncia de dados: JPA (Java Persistence API) [Sun09b] e JDO (Java Data Objects) [Sun09c]. Persistncia de dados o armazenamento no-voltil de dados [WIKI09a][BLJ09]. Ou seja, ao final da execuo de uma aplicao de software, os dados armazenados em memria RAM ficam persistidos em disco, at que estes sejam excludos pelo usurio.
Em uma arquitetura de software divididas em camadas, a camada de persistncia ou de acesso aos dados a parte do software responsvel por se comunicar com o BD (banco de dados) [Uni09] ou com o framework de persistncia [Sil09] (ver Figura 1).
A camada de persistncia permite a conexo com o BD e a manipulao de seus dados. Alm disso, responsvel por transformar esquemas de objetos em esquemas relacionais, j que em muitos casos o BD relacional. Assim, o BD pode ser acessado usando um framework de persistncia ou escrevendo comandos em SQL [Sil09]. Software desenvolvidos em Java [Sun09f] e que acessam um BD Relacional (BDR) [Ric02] requerem um mapeamento entre os objetos da aplicao e a estrutura tabular do BDR (o contrrio 9
tambm verdade). Este mapeamento chama-se Object-relational mapping (ORM) [Amb97] e resumidamente apresentado da seguinte forma: as tabelas do BD so representadas atravs de classes e os registros de cada tabela so representados como instncias das classes correspondentes. Com essa tcnica, a necessidade de comandos SQL se torna mnima, pois o desenvolvedor poder usar uma interface de programao simples onde o framework pode fazer todo o trabalho de persistncia. A forma como o ORM configurado depende da ferramenta que ser utilizada. Por exemplo, usando Hibernate [Hib09a] com Java, o ORM pode ser feito atravs de arquivos XML [XML09] ou do uso do padro annotations [Sun09a] da prpria linguagem. Ento, visando a padronizao do ORM, que era feito de inmeras formas, dependendo da soluo escolhida, foram propostas duas API, JPA e JDO. As duas trazem alm de padronizao, transparncia e abstrao no desenvolvimento de aplicaes, tornando o desenvolvimento mais leve, limpo e simples. Por isso, so consideradas fortes candidatas a se manterem como preferidas no desenvolvimento desses tipos de aplicaes [WIKI09c]. Ressalta-se que annotation uma forma especial de metadados que pode ser adicionado ao cdigo Java. Com o uso de annotation, consegue-se adicionar informaes sobre um programa, as quais no fazem parte do programa em si, no tem efeito direto na operao do cdigo [Sun09a]. JPA e algumas verses mais atualizadas de JDO utilizam o padro de annotations adotado na verso 5.0 de Java.
1.1.
Motivao
O desenvolvimento deste trabalho foi motivado pela existncia de vrias formas de realizar o ORM, h busca por solues que padronizassem essa tcnica de mapeamento. Dessa forma, foram encontradas duas API que fazem esse trabalho, JPA e JDO, e com isso, foi gerado o interesse de disponibilizar um material de estudo prtico e comparativo dessas duas API.
1.2.
Objetivo
O objetivo deste trabalho oferecer um documento que, de forma prtica, exemplifique a utilizao das API JPA e JDO, comparando-as com base nas suas linguagens de acesso a dados,
10
JPQL [Sun09g] e JDOQL [Sun09h], respectivamente. Alm disso, estas API tero seu poder de expressividade comparado com o poder de expressividade de SQL.
1.3.
Esta seo apresenta o esquema conceitual de um BD que ser usado como exemplo guia, bem como a sistemtica que ser empregada para o estudo e comparao das API JPA e JDO.
1.3.1.
Esquema conceitual
A Figura 2 corresponde ao esquema conceitual, feito na ferramenta CASE BRModelo [BRM09], que modela um BD fictcio para gesto de eventos cientficos. O mini-mundo foi modelado com o objetivo de conter as vrias formas de relacionamento, M:N, 1:N e 1:1, e alguns dos conceitos mais encontrados em esquemas ER [Mel09], a saber: herana, atributos multivalorados e compostos, entidade fraca e atributo na relao. 11
No esquema acima, um Artigo s pode ser publicado em um Evento, porm um Evento pode ter vrios Artigos publicados. Um Artigo pode ser escrito por vrios Pesquisadores assim como vrios Pesquisadores podem escrever vrios Artigos, com uma ordem de apario nos Artigos. Um Pesquisador pode ou no ser Bolsista. Um Evento possui apenas uma Comisso, assim como uma Comisso se relaciona apenas com um Evento, e s existe se o Evento existir. Uma Comisso pode possuir um ou vrios membros.
1.3.2.
Sistemtica de Estudo
A sistemtica de estudo deste trabalho foi construda visando facilitar o entendimento das duas API e definida da seguinte forma: Conceitos Bsicos nesta seo so apresentados alguns conceitos bsicos das API, caractersticas e implementaes; Exemplo Prtico nesta seo apresentado como o exemplo guia da seo 1.3.1 desenvolvido segundo a especificao de cada API. Esta seo subdividida da seguinte forma: o Configurao do ambiente: explica quais ferramentas foram utilizadas para o desenvolvimento da aplicao bem como as bibliotecas necessrias; o Criao do Projeto: explica como criar o projeto; o Criao de Entidades: explica como criar as classes do projeto; o Definindo o ORM: nesta seo comea a explicao de como fazer o ORM, e dividido em vrias sees, onde cada uma explicar o mapeamento de uma parte da aplicao. So elas: Definir Tabelas e Colunas; Definir Herana; Definir Atributo Composto e/ou Multivalorado; Definir Relacionamentos; Um-Para-Um; Muitos-Para-Um; Muitos-Para-Muitos; 12
Definir Propriedades da Persistncia: nesta seo ser explicado como criar os arquivos de configurao necessrios para cada API; Trabalhando a Persistncia: nesta seo sero mostradas as classes responsveis pelo gerenciamento dos objetos e como elas so criadas no projeto. Em seguida sero mostrados exemplos das operaes bsicas com objetos: Insero; Alterao; Remoo; Busca.
1.4.
Estrutura do Trabalho
Este documento divide-se em 5 captulos. Neste captulo feita uma apresentao do trabalho, com uma introduo aos conceitos necessrios para seu entendimento, a motivao, o objetivo, o exemplo guia, a sistemtica de estudo e a estrutura deste documento. O captulo 2 discorre sobre JPA, apresentando uma breve introduo sobre a API e a implementao do exemplo guia segundo a especificao de JPA. O captulo 3 versa sobre JDO, com a mesma abordagem do captulo 2. O captulo 4 apresenta um estudo sobre as diferenas entre JPA e JDO, tomando como base principal as suas linguagens de acesso a dados, JPQL e JDOQL respectivamente. E por fim, o captulo 5 apresenta a concluso obtida com o trabalho, contribuies e trabalhos futuros.
13
2.1.
JPA foi desenvolvida pela equipe de software do EJB (Enterprise JavaBeans) 3.0[Sun09e] como parte do JSR 220 (Java Specification Request) [JPA09]. Esta API permite o desenvolvimento rpido e simplificado de aplicaes distribudas, transacionais, seguras e portveis baseadas na tecnologia Java. Mas seu uso no limitado a componentes de software da EJB. Ela pode ser utilizada diretamente por aplicaes web e desktop, sendo esta ltima a plataforma escolhida para o desenvolvimento do exemplo guia deste trabalho. A API JPA disponibiliza um conjunto de interfaces de programao que permitem o armazenamento de objetos Java chamados de entidades do BD. De forma simplificada, pode-se entender uma entidade como um objeto Java regular (ou POJO - Plain Old Java Object) [WIKI09e]. A API utilizada na camada de persistncia para o desenvolvedor obter uma maior produtividade, pois controla a persistncia de objetos dentro de Java. Ou seja, a implementao da API que ir se preocupar em transformar os objetos em linhas e colunas nas tabelas do BD. A entidade um objeto Java mapeado para um BDR. Para isso, necessrio que seja declarada explicitamente uma entidade a fim de distingui-la de outros objetos Java regulares que podem ser usados na aplicao, e preciso definir uma forma de mapear a entidade em uma das tabelas do BD. Uma vez que estas informaes so consideradas metadados, JPA baseia-se no padro Java SE 5 [Sun09d] para prover estes metadados no formato de annotations. JPA tambm permite o uso de XML para definir estes metadados [HGR09]. No entanto, annotations so mais fceis de entender e implementar. Por isso, escolheu-se este formato para o desenvolvimento do exemplo guia. Ressalta-se que uma vez feito o ORM, se houver uma mudana da soluo que implemente JPA, no ser necessrio realizar alteraes significantes no ORM, pois qualquer soluo que implemente JPA ser capaz de entender a linguagem de mapeamento. Apenas bibliotecas e arquivos de configurao devero sofrer alteraes relacionadas nova implementao [Sil08]. Alm disto, outras vantagens tornam o uso de JPA atraente [Oco07]: No necessria a criao de objetos de acesso a dados complexos; 14
A API auxilia no gerenciamento de transaes; Possibilidade de escrever cdigo padro que interage com qualquer base de dados relacional, livre de cdigo especfico de fabricantes; possvel descartar SQL, dando preferncia a uma linguagem de consulta que usa os nomes das classes e suas propriedades; e possvel usar e gerenciar POJO. Atualmente, h vrias implementaes de JPA no mercado. Entre elas, pode-se citar: EclipseLink (eclipse) [Ecl09a], TopLink (Oracle) [Ora09]a, Hibernate (RedHat) [Hib09b], TopLink Essentials (GlassFish) [Gla09], Kodo (Oracle) [Ora09b], OpenJPA (Apache) [Apa09a] e Ebean (SourceForge) [Sou09]. Cada implementao apresenta seus pontos positivos e negativos, levando em considerao licenas, velocidade de processamento de consultas, erros, bibliotecas adicionais, entre outros fatores. Para a implementao do exemplo guia deste trabalho foram escolhidas as ferramentas Hibernate e Eclipse, pois estas so bem consolidadas e aceitas pela comunidade de desenvolvedores.
2.2.
Exemplo Prtico
Esta seo segue a sistemtica apresentada na seo 1.3.2 e apresenta como o exemplo guia da seo 1.3.1 foi implementado usando JPA (Hibernate com Eclipse).
2.2.1.
Configurao do ambiente
Para iniciar o desenvolvimento de uma aplicao utilizando JPA, necessrio que sejam feitas algumas configuraes no ambiente de desenvolvimento. Este exemplo requer Java 5 (JDK 1.5) [Sun09i] ou superior e Eclipse 3.2 [Ecl09b] ou superior. necessria tambm a biblioteca que contenha javax.persistence e os vrios annotations associados ao JPA. Neste caso, como a implementao da API utilizada a do Hibernate, as seguintes bibliotecas sero necessrias: Hibernate 3.3.1 GA o antlr-2.7.6.jar o commons-collections-3.1.jar o dom4j-1.6.1.jar 15
o hibernate3.jar o javassist-3.4.GA.jar Hibernate Annotations 3.4.0 GA o hibernate-annotations .jar o hibernate-commons-annotations .jar Hibernate Entity Manager 3.4.0 GA o hibernate-entitymanager.jar SLF4J 1.5.8 o slf4j-api-1.5.8.jar o slf4j-simple-1.5.8.jar Open EJB 3.1.1 o javaee-api-5.0-2.jar A especificao de javax.persistence est includa na biblioteca javaee-api-5.0-2.jar. Alm das bibliotecas para configurar JPA e o Hibernate, tambm necessria a biblioteca do BD escolhido. Neste caso, ser usado o SGBD MySQL [Mys09], e a biblioteca utilizada ser mysqlconnector-java-5.1.10-bin.jar.
2.2.2.
Criao do Projeto
Para seguir com a implementao, necessrio criar o projeto e adicionar as bibliotecas citadas na seo anterior, para que o sistema possa operar sem erros de configurao. O prximo passo a criao das classes que sero utilizadas. O projeto pode conter tanto classes que sero mapeadas para a base de dados como classes de auxlio que no faro parte do banco. Para diferenciar essas classes, necessrio indicar explicitamente quais delas sero mapeadas em entidades [ASF09a]. Os passos descritos a seguir so baseados na API especificada por JPA e no correspondem s caractersticas de implementao do Hibernate, podendo ser seguidos para desenvolvimento de aplicaes que utilizem qualquer soluo citada na seo 2, como TopLink ou EclipseLink, por exemplo, ou que implementem JPA.
16
2.2.3.
Criao de Entidades
Para exemplificar a criao de entidades, ser utilizada a classe Pesquisador. O primeiro passo para a criao das entidades, a criao da classe simples, com seus atributos, mtodos get e set, e o construtor. A nica restrio imposta por JPA que seja inserido um construtor sem argumentos, mas no impede que outros construtores tambm sejam adicionados. A Figura 3 mostra como foi definida a classe Pesquisador.
17
2.2.4.
Definindo o ORM
O ORM o mapeamento dos objetos do sistema em uma estrutura tabular do BDR. Nesta seo, sero explicados os passos necessrios para mapear os objetos e seus relacionamentos, herana, atributos multivalorados, compostos, entidades fracas e atributos de relacionamento.
18
Voltando para o exemplo a ser estudado, a declarao de entidade e de chave primria ficaria como apresentado na Figura 5:
Alm da annotation @Id, pode-se inserir a annotation @GeneratedValue (ver Figura 5), que especifica que o valor da chave primria ser gerado automaticamente pelo sistema seguindo uma sequncia, partindo de 1. Alm dessas annotation, tambm pode-se definir os nomes das tabelas e das colunas do banco inserindo @Table na definio da classe e @Column na definio dos atributos. No entanto, JPA faz suposies quanto ao nome da tabela e das colunas, se estes dados no forem explicitados. Ento, caso se deseje alterar o nome das tabelas e das colunas para que seja diferente do nome das classes e atributos, deve-se deixar claro inserindo essas informaes.
19
A partir do Quadro 1, a classe Pesquisador pode ficar com o nome da tabela TB_PESQUISADOR, o atributo id com o nome idPesquisador e os demais atributos com o nome especificado na classe, caso o mapeamento seja realizado da forma mostrada na Figura 6.
mapeamento de herana suportadas por JPA e ao final ser descrita a escolha da estratgia de mapeamento escolhida para este trabalho.
A estratgia padro chamada de SINGLE TABLE. Escolhendo esta estratgia, a classe base, ou seja, o topo da hierarquia de herana, ser mapeada para uma tabela e todas as subclasses sero persistidas nessa tabela. Dessa forma, existir apenas uma tabela com todos os atributos das classes pertencentes a essa hierarquia de herana. O esquema ficaria da forma mostrada na Figura 8.
21
Outra forma obter uma tabela para cada classe da hierarquia de herana, e cada tabela ter apenas colunas para os atributos definidos na sua classe. Os campos da superclasse so persistidos na tabela da superclasse.
Consequentemente, para recuperar todos os valores dos campos de uma subclasse, precisa ser feito um join de todas as tabelas das superclasses da hierarquia. Em JPA, esta forma chamada de JOINED. A Figura 9 mostra como as tabelas seriam persistidas no BD.
22
A terceira forma como a segunda, exceto pelo fato de que cada tabela ter as colunas para todos os campos herdados. Esta forma chamada de TABLE_PER_CLASS. A Figura 10 mostra como as classes seriam persistidas no BD.
No exemplo guia da seo 1.3.1 h uma herana entre Pesquisador e Bolsista, onde um Pesquisador pode ser um bolsista. A forma escolhida para implementar a herana foi a segunda, a JOINED, de forma que ao criar o esquema no BD, haver uma tabela Pesquisador e uma Bolsista, onde a chave primria de Bolsista ser a chave primria de Pesquisador e os campos em cada tabela sero os campos definidos em cada classe. Na Figura 11 e na Figura 12 possvel observar como foi feito o mapeamento para esse tipo de herana.
23
Como se pode observar, a superclasse Pesquisador recebe a annotation @Inheritance, com o valor de estratgia JOINED, que responsvel por informar que ser esse o tipo de herana dessa hierarquia. Na classe Bolsista, apenas implementada a herana em Java, usando o extends.
24
Nesta forma de mapeamento, os atributos de Endereo sero inseridos na tabela Pessoa e ao remover um objeto Pessoa, seu endereo tambm ser automaticamente removido.
2.2.4.4.1. Um-Para-Um
Considerando o exemplo das entidades Evento e Comissao, onde cada evento possui uma Comissao e uma Comisso s pertence a um Evento, obtm-se um relacionamento do tipo um-para-um. Para o caso onde no existe uma entidade fraca, uma das entidades ter uma chave estrangeira que apontar para a outra entidade. Sendo assim, foi considerado que a classe Evento teria um atributo idComissao, cujo valor corresponder sua referncia na classe Comissao. A
Figura 14 mostra como ficaria o mapeamento nas classes Evento e Comissao.
25
No mapeamento acima foi estabelecida uma associao bidirecional, ou seja, cada uma das entidades possui uma annotation do tipo @OneToOne. Mas ao transpor o mapeamento para o BD, apenas a tabela Evento possuir o atributo endereo devido ao annotation de JPA @JoinColumn, onde especificado que esse atributo ser persistido como uma coluna da tabela Evento e seu nome ser idComissao. O atributo evento de Comissao usado para, ao fazer uma busca por endereo, esse campo vem preenchido com o evento correspondente, que mapeado pelo atributo endereo, localizado na entidade Evento. Para o caso do esquema apresentado na seo 1.3.1, a entidade Comisso fraca, ou seja, sua chave primria e estrangeira sero as mesmas, e sero iguais a chave primria de Evento, ou seja, no h insero de uma nova coluna para a chave estrangeira. Sendo assim, a annotation @PrimaryKeyJoinColumn utilizada no lugar da @JoinColumn, e invertida a entidade que recebe essa annotation, j que a entidade forte Evento. Neste caso, o mapeamento dever ser feito conforme mostrado na Figura 15.
26
Segundo [BK07], a especificao de JPA no inclui um mtodo padronizado para lidar com o problema de compartilhamento de gerao de chave, o que significa que a aplicao deve ficar responsvel por fornecer o valor do identificador da entidade fraca, no caso Comissao antes de salv-la no banco. O Quadro 2 e o Quadro 3 contm mais algumas caractersticas dos annotations utilizados para o mapeamento um-para-um.
2.2.4.4.2. Muitos-Para-Um
Para o mapeamento muitos-para-um, foi utilizado o exemplo do relacionamento entre Artigo e Evento, onde um Artigo pode participar de apenas um Evento, mas um Evento pode conter mais de um Artigo. Neste caso, a relao ser caracterizada pela chave estrangeira da entidade de lado N no lado 1, ou seja, Artigo dever conter um atributo idEvento, que ser a referncia para o Evento a que se relaciona. Na Figura 16 pode-se observar como ficar a implementao. 27
Observa-se que as caractersticas do annotation @ManyToOne e @OneToMany tambm esto presentes no mapeamento @OneToOne, e possuem o mesmo significado (ver
Quadro 2 e Quadro 3). Tambm vale ressaltar que a declarao de algumas dessas caractersticas
no so obrigatrias e tambm possvel declarar de vrias formas, desde que no v de encontro com as regras de mapeamento. Caso isso ocorra, um erro ser gerado pelo sistema.
2.2.4.4.3. Muitos-Para-Muitos
J para o mapeamento muitos-para-muitos, foi utilizado o exemplo do relacionamento entre Artigo e Pesquisador, onde um Artigo pode ser escrito por um ou mais Pesquisadores, assim como um Pesquisador pode escrever um ou mais Artigos. Um relacionamento sem atributo deve gerar uma tabela extra, contendo suas chaves primrias, enquanto um relacionamento com atributos deve gerar uma tabela contendo as chaves primrias das entidades relacionadas e os atributos da relao. O exemplo mostrado na Figura 17 apresenta um mapeamento M:N sem atributo.
28
Nesse mapeamento, pode-se notar que aparece um novo annotation, JoinTable, que usado para mapear esse relacionamento em uma nova tabela, que conter joinColumns e inverseJoinColumns. Nesse caso, idArtigo e idPesquisador, e a nova tabela se chamar ESCREVE. J para as caractersticas de @ManyToMany no houve mudanas quanto ao significado de cada uma. Alm de estabelecer uma nova tabela, o JoinTable permite que, ao fazer uma consulta tabela de Artigo, o campo pesquisadores venha carregado com os pesquisadores que escreveram o artigo, assim como acontece se a busca for por Pesquisador. Para um relacionamento M:N com atributo, deve-se criar uma entidade extra, e sero consideradas relaes 1:N entre a entidade extra e as entidades da relao. A Figura 18 apresenta como ficou o mapeamento nas classes Artigo e Pesquisador para relacionamento com atributo.
29
O relacionamento M:N ento se torna 2 relacionamentos 1:N. Na Figura 18 possvel ver os lados 1 da relao. Na Figura 19, possvel ver o lado N da relao, a classe extra ArtigoPesquisador. Nesta classe sero especificados atributos que se relacionam com Artigo e Pesquisador. Ao definir @JoinColumn, especifica-se que a entidade ter uma chave estrangeira para a entidade em questo. E ao definir os identificadores da classe com o mesmo nome das chaves estrangeiras, a entidade ter as chaves primrias e estrangeiras persistidas na mesma coluna.
30
2.2.5.
O esquema de dados de uma aplicao JPA consiste geralmente de diversas entidades de classes, as quais precisam ser mapeadas juntas na mesma base de dados. As classes de entidade formam uma unidade lgica que chamada de unidade de persistncia (persistence unit). Em uma aplicao JPA, necessria a definio da unidade de persistncia a partir da configurao de um arquivo chamado persistence.xml. possvel, mas no obrigatrio, que sejam listadas explicitamente as entidades que formam a unidade de persistncia. Se no forem listadas, a implementao JPA varre a aplicao e detecta as entidades automaticamente. Neste 31
arquivo tambm podem ser includas caractersticas da implementao JPA, como o driver do banco utilizado, a base de dados, a senha, entre outras informaes [ASF09a]. Quanto a base de dados, indicado que seja sempre especificada nesse arquivo. Tecnicamente, especificar o nome da fonte de dados relacionada unidade de persistncia opcional no arquivo persistence.xml. Se o nome da fonte de dados omitida, alguns provedores automaticamente utilizam um construtor padro de fonte de dados, outros assumem um nome padro, mas no provm a fonte de dados propriamente dita, e outros podem rejeitar a unidade de persistncia por estar incompleta. Por essa razo, extremamente recomendado que o nome da fonte de dados a ser usada seja sempre especificado. De acordo com a aplicao utilizada nesse trabalho, o arquivo de configurao ficou como mostrado na Figura 20.
Este arquivo de configurao se repetir para outras implementaes de JPA, havendo mudanas apenas no que est dentro da tag <properties>, onde sero especificadas as informaes da base de dados a ser utilizada
32
2.2.6.
Trabalhar a Persistncia
Em uma aplicao com JPA, trabalha-se normalmente com as entidades, j que estas so objetos simples de Java. Mas para que as mudanas sejam refletidas no banco, preciso utilizar o entity manager, que ir gerenciar as instncias de entidades. Para que isso ocorra, preciso que se coloque explicitamente a entidade sob o controle do referido entity manager. Com ele controlando a entidade, suas mudanas sero sincronizadas com a base de dados. Uma vez que esse controle acabe, a entidade volta a ser apenas um objeto Java. A interface javax.persistence.EntityManager utilizada para interagir com o entity manager. Sero mostradas as 4 formas bsicas de interao: insero, alterao, excluso e busca. Para realizar as operaes, necessrio primeiramente inicializar o EntityManager, como pode-se ver na Figura 21.
O nome passado no mtodo createEntityManagerFactory dever ser o mesmo nome especificado no arquivo persistence.xml, no campo nome da tag <persistence-unit> visto na seo 2.2.5.
33
2.2.6.1. Insero
Para realizar uma insero simples. Basta passar o objeto criado com os valores dos atributos como parmetro para o mtodo persist( ), como mostrado na Figura 22
2.2.6.2. Alterao
A operao de alterao tambm segue o mesmo raciocnio, apenas mudando o mtodo utilizado, que neste caso ser o merge( ), como mostrado na Figura 23.
34
2.2.6.3. Excluso
Para excluir um objeto, preciso que ele j esteja em poder do entity manager. Para isso, pode-se dentro do escopo do mesmo entity manager dar um merge ou um find, e a sim chamar o mtodo remove( ). Segue o exemplo na Figura 24.
2.2.6.4. Busca
Para buscar um objeto, preciso informar o tipo e o id da entidade, que sero passados como parmetro no mtodo find( ), como mostrado na Figura 25:
35
2.3.
Concluso
Este captulo introduziu os principais conceitos sobre JPA, e em seguida mostrou como realizar ORM utilizando esta API. O exemplo prtico foi divido em vrias partes, sendo usado o esquema apresentado na seo 1.3.1 para exemplificar o mapeamento. Foi visto que JPA consegue abordar grande parte dos conceitos relacionais, apenas apresentando problemas em atributos multivalorados. Ao final, foram apresentadas as 4 formas bsicas de interao com o BD: insero, atualizao, remoo e busca, onde foi visto que no foi necessrio o uso de linguagens de consulta. O prximo captulo apresentar uma introduo sobre JDO e em seguida um exemplo prtico, seguindo o mesmo esquema do apresentado neste captulo, utilizando a API JDO.
36
3.1.
A especificao de JDO [Sun09c], JSR12 [Web09b], define uma API de padronizao de ORM e persistncia transparente de POJO e acesso a BD. Usando JDO, desenvolvedores de aplicaes em Java podem escrever cdigo para acessar os dados armazenados no BD sem usar qualquer tipo de linguagem especfica para este fim. Os dois principais objetivos da arquitetura de JDO so prover uma viso transparente de persistncia de dados aos desenvolvedores e permitir implementaes de armazenamento de dados em servidores de aplicao. importante notar que JDO no define o tipo do BD. Pode ser utilizada a mesma interface para persistir objetos Java em bases de dados relacional, objetorelacional, XML ou qualquer outra base [Sun09c]. Alguns dos benefcios do uso de JDO so [Sun09c]: Portabilidade - aplicaes escritas usando a API de JDO podem operar com vrias implementaes disponveis de diferentes distribuidores sem precisar mudar uma linha de cdigo ou recompilar; Acesso transparente base de dados - desenvolvedores de aplicao escrevem cdigo para acessar dados armazenados sem precisar utilizar cdigo de acesso base de dados especfico; Facilidade de uso - a API JDO permite que desenvolvedores de aplicao foquem em seus esquemas de objetos e deixem os detalhes de persistncia implementao de JDO; Alto desempenho - esta tarefa delegada s implementaes Java que podem melhorar os padres de acesso a dados para obter um melhor desempenho; e Integrao com EJB - aplicaes podem tirar vantagem dos recursos de EJB como processamento remoto de mensagens, coordenao de transaes automticas distribudas e segurana. 37
So encontradas diversas implementaes da API JDO. Algumas mais desenvolvidas e otimizadas que outras. O Quadro 4 mostra algumas das implementaes:
Para a implementao do exemplo guia da seo 1.3.1, ser usada a implementao DataNucleusAccess, por ser considerada uma das mais desenvolvidas e j utilizar a nova verso JDO 2.3 e a IDE Eclipse 3.2.
3.2.
Exemplo Prtico
Esta seo segue a sistemtica apresentada na seo 1.3.2 e apresenta como o exemplo guia da seo 1.3.1 foi implementado usando JDO (DataNucleusAccess com Eclipse) [Dat09a]. Ressalta-se que, assim como a implementao do exemplo guia com JPA no est limitada ao uso de Hibernate, a implementao do exemplo guia com JDO tambm no est restrita implementao do DataNucleusAccess.
38
3.2.1.
Configurao do ambiente
Para a implementao do exemplo guia da seo 1.3.1 foi usado um plugin da implementao DataNucleusAccess para o Eclipse e o SGBD escolhido foi o MySQL 5.1. Como o objetivo analisar a API de JDO, sero omitidos detalhes a respeito desse plugin. Mas, para maiores informaes basta acessar o site do distribuidor: http://www.datanucleus.com/. Para dar incio a implementao, so necessrias as seguintes bibliotecas: datanucleus-core-1.1.3.jar datanucleus-enhancer-1.1.3.jar datanucleus-jpa-1.1.3.jar datanucleus-rdbms-1.1.3.jar asm-3.1.jar jdo2-api-2.3-ea.jar log4j-1.2.8.jar mysql-connector-java-5.1.10-bin.jar
3.2.2.
Criao do Projeto
Para seguir com a implementao, necessrio criar o projeto e adicionar as bibliotecas citadas na seo anterior, para que o sistema possa operar sem erros de configurao. O prximo passo a criao das classes que sero utilizadas. JDO separa as classes de uma aplicao, atravs dos metadados, em trs categorias [Mah05]: Persistence-capable - esta categoria representa classes em que suas instncias podem ser persistidas em uma base de dados. Essas classes precisam ser aprimoradas (enhanced) de acordo com a especificao do metadado JDO antes de serem usadas em um ambiente JDO; Persistence-aware - essas classes manipulam classes persistence-capable. A classe JDOHelper [Apa09b] prov mtodos que permitem interrogar o estado de persistncia de uma instncia de classe persistence-capable. Essas classes so aprimoradas com o mnimo de metadados; e Normal - essas classes no so persistentes e no possuem conhecimento de persistncia. No necessitam de nenhum metadado. 39
3.2.3.
Criao de Entidades
A criao de entidades em JDO no difere muito da criao de classes normais de projetos Java, ou seja, no requerem muito cdigo diferente. necessria apenas a definio do tipo de classe definido na seo anterior, para determinar como deve ser persistida. Com JDO 2.3 possvel fazer isso de vrias formas: XML Metadado; Annotations; Annotations + XML; e API de Metadados em tempo de execuo.
Para esse trabalho, a informao de persistncia bsica foi feita com annotations e depois foi adicionado informao em XML. A definio feita conforme a Figura 26.
Da mesma forma como JPA, JDO requer um construtor padro, como pode ser visto na
Figura 26. Depois de definir o tipo de classe, definida a forma de persistncia dos atributos da
classe.
40
3.2.4.
Definindo o ORM
JDO utiliza arquivos de metadados baseados em XML para especificar informaes relativas persistncia incluindo quais classes da aplicao devero ser persistidas. O arquivo de metadados pode conter informaes de uma nica classe persistente ou um ou mais pacotes onde haver a definio de vrias classes persistentes. Este arquivo pode definir propriedades de persistncia para uma classe ou um pacote inteiro em um ou mais arquivos XML. O nome do arquivo para uma classe dever ser o mesmo nome da classe, seguido da extenso .jdo. Portanto, o arquivo de metadados para a classe Artigo dever se chamar Artigo.jdo, e dever estar localizado no mesmo diretrio do arquivo Artigo.class. Os metadados para um pacote inteiro devero estar contidos em um arquivo chamado package.jdo, que poder conter informaes de vrias classes e vrios sub-pacotes [Han05]. A ordem de busca pelo arquivo de metadados a seguinte: META-INF/package.jdo WEB-INF/package.jdo package.jdo entidades/package.jdo entidades/package.jdo
entidades/Artigo.jdo
Para definir que o arquivo um metadado de JDO, o mesmo deve comear com o cabealho definindo o XML e a DTD utilizada. Aps essa definio, abre-se uma tag <jdo> e <package>, onde ser especificado o nome do pacote a que esse arquivo XML se refere. A Figura
27 mostra como deve ser o incio do arquivo de mapeamento.
41
Nesta seo, sero explicados os passos necessrios para mapear os objetos e seus relacionamentos, herana, atributos multivalorados, compostos, entidades fracas e atributos de relao.
Quando no se define o atributo table, a tabela ser criada com o nome da classe. Na tag <column>, definido o nome que o atributo id ter na tabela Artigo, nesse caso idArtigo. Alm de nome, esta tag tambm contm definies de tamanho e tipo do atributo, podendo ser definida da seguinte maneira:
<column name=IDENTIFIERNAME length=100 jdbc-type=VARCHAR/>
Para definir o mapeamento dos atributos da classe, especificada a tag <field>, onde sero definidos todos os atributos persistentes da classe em questo. Na tag <field>, podem-se definir caractersticas quanto a forma de persistncia, propriedades quanto a relacionamentos e 42
definir que um determinado atributo chave primria. Para definir uma chave primria, utiliza-se primary-key=true. No exemplo da Figura 29, esse campo est como false, pelo atributo no se tratar de uma chave primria. Para uma chave composta, basta inserir primary-key=true nos campos que compem a chave.
A segunda forma a chamada subclass-table. Nessa opo, preciso escolher uma classe para ter seus campos persistidos na tabela de sua subclasse. geralmente escolhido quando se tem uma classe abstrata e no faz sentido ter uma tabela separada para essa classe. No exemplo utilizado, pode-se considerar desnecessrio ter-se uma tabela separada para a classe abstrata ProdutoAbstrato. Para fazer o mapeamento deste tipo de herana, deve-se inserir o mesmo cdigo do exemplo acima em cada uma das classes, exceto na que no se deseja reproduzir no banco, onde o cdigo a ser inserido :
<inheritance strategy=subclass-table/>
Aplicando esse tipo de mapeamento para a herana entre Produto e ProdutoAbstrato, tem-se o formato no BD especificado na Figura 31.
44
A terceira e ltima opo a superclass-table. Nessa forma, escolhida uma classe para ter seus campos persistidos pela tabela de sua superclasse. Sua vantagem que a recuperao de um objeto feita atravs de uma nica chamada SQL a uma tabela. A desvantagem que uma nica tabela pode conter um nmero muito grande de colunas, e a leitura e o desempenho da base de dados podem sofrer, e necessria uma coluna a mais, o discriminator. Para este exemplo, a tabela ProdutoAbstrato ser ignorada e Produto ser considerado a classe base. Se no h interesse em ter uma tabela Livro e uma tabela CD, ento se ter uma tabela Produto onde todos os atributos sero armazenados. Ento o cdigo de descrio de produto ficar como na Figura 32, e o no mapeamento das tabelas que no iro ser criadas no BD dever ser inserido o seguinte cdigo:
<inheritance strategy=superclass-table/>
45
O tipo de herana escolhido para o exemplo prtico deste trabalho foi a estratgia new-table, onde haver uma tabela para cada classe da hierarquia de herana. A Figura 34 mostra como ficou o mapeamento no arquivo de metadados.
46
47
Como se pode ver na Figura 36, o conjunto de Strings armazenado na tabela T_SET. A coluna correspondente ao elemento SRT. A unio desse elemento a essa tabela baseada no identificador da classe. A coluna da chave estrangeira a FKIDA. Caso a classe seja formada por uma chave primria composta, ento se deve declarar uma coluna para cada chave primria dentro do escopo do <join/>. Caso o atributo multivalorado seja composto, o mapeamento ocorre de maneira semelhante, exceto pela definio do <element>, como se pode observar na Figura 37.
Como se pode observar na Figura 38, o mapeamento do atributo composto multivalorado, os conjuntos de B so armazenados na tabela TAB. A coluna correspondente s referncias das instncias de B FKIDB. Essa coluna referencia implicitamente a coluna de identificao da classe referida (B). A unio com a tabela TAB baseada no identificador da classe A. A coluna da chave estrangeira FKIDA. Da mesma forma que a anterior, se A for formada por chave primria composta, ento se incrementa <join> com as colunas referentes s chaves primrias.
48
Pela implementao utilizada nesse exemplo prtico no dar suporte a esse tipo de mapeamento, a relao entre Membro e Comisso, onde Membro um atributo composto e multivalorado de Comisso, a relao foi construda como uma relao 1:N.
3.2.4.4.1. Um-Para-Um
Para trabalhar com o mapeamento um-para-um, foi utilizado como exemplo o relacionamento entre Evento e Comissao. Ao final do mapeamento, obtm-se a referncia de Comissao em Evento, no esquema da base de dados. A Figura 39 mostra o mapeamento das duas classes:
49
Declara-se que h um campo comissao persistente em Evento. Na classe Comissao, declarado que existe um campo evento, persistente, que mapeado por um campo comissao, ou seja, o valor do campo comissao de um Evento est relacionado a uma comissao que contenha como identificador o valor deste campo, e o Evento atrelado a uma comissao o que possui idComissao igual ao id do objeto comissao em questo. Ao considerar Comisso uma entidade fraca, a forma de mapeamento sofre algumas alteraes, como pode ser visto na Figura 40.
Neste caso, alm de definir um atributo do tipo de Comissao em Evento e um atributo do tipo Evento em Comissao, preciso definir a chave primria de Comissao (object-id) na classe, que ser igual a chave primria de Evento. A Figura 41 mostra a declarao da chave primria PK em Comisso. Declara-se uma classe esttica que implementa a interface Serializable de Java. Nessa classe, define-se um atributo do tipo da classe de onde se obter a chave primria de Comissao. Dessa forma, a chave primria de Comisso ter o mesmo valor da chave primria de Evento e Comisso s ter uma coluna, que ser tanto a chave primria quanto a chave estrangeira.
50
51
3.2.4.4.2. Muitos-Para-Um
Para este outro mapeamento, muitos-para-um, foi utilizado como exemplo o relacionamento entre Artigo e Evento. Neste caso, assim como com relao a JPA, a tabela Artigo conter o id do Evento que est atrelado. Pode ser observado na Figura 42 como fica o mapeamento em questo.
No mapeamento da classe Evento, especifica-se uma coleo de artigos persistente, que ser mapeada pelo atributo evento. Tambm deve ser especificado o tipo da coleo, que no caso do exemplo, do tipo entidades.Artigo. J no mapeamento da classe Artigo, declara-se o atributo evento, que ser a chave estrangeira da relao. A tag <fecth-group> utilizada para especificar que um atributo instncia de outro objeto que no o que est sendo mapeado. Ao definir essa tag, ela poder ser utilizada ao carregar objetos nas consultas. Dessa forma, chamando este fetch-group includingEvento, ao carregar objetos do tipo Artigo, o atributo evento ir ser carregado com o objeto Evento relacionado. Um exemplo de utilizao poder ser encontrado na seo 4 deste trabalho.
3.2.4.4.3. Muitos-Para-Muitos
No mapeamento muitos-para-muitos, foi usado como exemplo a relao entre Artigo e Pesquisador, onde um artigo pode ser escrito por vrios pesquisadores e vrios 52
pesquisadores podem escrever um mesmo artigo. No caso onde a relao no possui atributo, definido um relacionamento M:N entre as duas entidades, e ao criar o esquema no BD, sero criada uma tabela contendo as chaves primrias das entidades da relao. J no caso onde h atributos na relao, dever ser criada uma classe extra, e sero definidos relacionamentos 1:N entre as entidades da relao e a entidade extra criada.Ao montar o esquema no BD, ser criada a tabela da mesma forma que relacionamentos sem atributo, no entanto sero acrescentados os atributos da relao. Pode-se analisar o primeiro caso de mapeamento de relacionamento M:N (sem atributo) na Figura 43.
Neste tipo de relacionamento, s necessrio declarar em apenas um dos mapeamentos de classe as informaes da relao. Como mostrado na Figura 43, foi declarado na classe Arquivo uma coleo de pesquisadores, persistente, que mapeada pelo atributo artigos, que tambm uma coleo da classe Pesquisadores. O item table define o nome da tabela da relao, no caso ESCREVE. O item join especifica o nome da coluna referente classe onde esto sendo definidas as caractersticas do mapeamento, e no item element, especifica-se o nome da coluna referente ao outro lado do relacionamento. A Figura 44 mostra como deve ficar o mapeamento de relacionamentos com atributos.
53
Assim como em mapeamento um-para-um com entidade fraca, tambm preciso definir uma classe esttica onde sero declaradas as chaves primrias da classe extra, ArtigoPesquisador. A Figura 45 mostra como ficar o mapeamento da nova classe ArtigoPesquisador e a Figura 46 mostra como dever ser composta a nova classe. Como se pode observar, define-se os atributos dos tipos das entidades da relao, os atributos da relao e a chave primria que ser composta pelas chaves primrias de artigo e de pesquisador.
54
55
3.2.5.
Para que a aplicao reconhea a base de dados a que ir se conectar, preciso definir algumas propriedades. Para isso, pode-se declarar diretamente no cdigo ou ento fazer uso de um arquivo auxiliar, passando apenas como parmetro o nome do arquivo, para que a aplicao carregue os dados. Dessa segunda forma, a aplicao se torna mais independente, quanto a no precisar alterar o cdigo, apenas o arquivo de configurao. A Figura 47 mostra o arquivo de configurao criado para a aplicao de exemplo.
3.2.6.
Trabalhar a Persistncia
H 3 (trs) interfaces essenciais na utilizao do JDO: javax.jdo.PersistenceManagerFactory - constri os objetos de acesso estrutura de dados subjacente; javax.jdo.PersistenceManager - fornece o acesso implementao JDO; e javax.jdo.Transaction - fornece o servio de demarcao de transies.
A partir dessas classes que se d a persistncia de fato dos objetos criados na aplicao. A classe PersistenceManagerFactory obtida a partir do arquivo de configurao da base de dados definido na seo 3.2.5. Com sua criao, obtm-se a classe PersistenceManager, de onde se obtm a transao. A Figura 48 mostra como ficou a criao das classes.
56
3.2.6.1. Insero
O processo de insero simples. Cria-se um objeto e chama-se o mtodo makePersistent, da classe PersistenceManager, dentro do escopo da transao, como pode ser observado na Figura 49.
57
3.2.6.2. Alterao
Para fazer atualizao de objetos, uma forma de se realizar buscar o objeto e fazer a atualizao dentro da mesma transao, como mostrado na Figura 50.
3.2.6.3. Remoo
Para realizar a remoo de um objeto, deve-se buscar o objeto e depois invocar o mtodo deletePersistent da classe PersistenceManager, passando o objeto como parmetro, sendo toda a operao dentro do mesmo escopo da transao, como mostrado na Figura 51.
58
3.2.6.4. Busca
Para realizar a busca de um objeto especfico, basta chamar o mtodo getObjectById, da classe PersistenceManager, passando como parmetro o id do objeto, como exemplificado na
Figura 52.
3.3.
Concluso
Este captulo introduziu os principais conceitos sobre JDO, e em seguida mostrou como realizar ORM utilizando esta API. O exemplo prtico foi divido em vrias partes, sendo usado o esquema apresentado na seo 1.3.1 para exemplificar o mapeamento. Foi visto que JDO consegue abordar grande parte dos conceitos relacionais, e no apresentou problemas em atributos mutivalorados, diferentemente de JPA, como foi visto no captulo 2. Ao final, foram apresentadas as 4 formas bsicas de interao com o BD: insero, atualizao, remoo e busca, onde foi visto que no foi necessrio o uso de linguagens de consulta. O prximo captulo apresentar uma anlise comparativa entre as API JPA e JDO, mostrando suas semelhanas e diferenas e sero apresentadas algumas caractersticas de suas linguagens, JPQL [Sun09g] e JDOQL [Sun09h], respectivamente. 59
4. Anlise Comparativa
Como pde ser visto nas sees anteriores, JPA e JDO oferecem uma soluo de padronizao de ORM, e apresentam algumas diferenas e semelhanas, como ser visto no decorrer desta seo. Tipo de Banco de Dados JPA d suporte apenas a BD relacionais, enquanto JDO d suporte a qualquer tipo de BD; Restries na construo da aplicao tanto JPA quanto JDO requerem um construtor sem parmetros nas classes a serem persistidas, porm JPA tambm no d suporte a classes e mtodos do tipo final; Herana em JPA s possvel definir um tipo de estratgia de herana para uma hierarquia, sendo a classe raiz, o topo da hierarquia, que define a estratgia a ser utilizada. J em JDO para cada entidade da hierarquia possvel definir uma estratgia diferente, j que a estratgia da herana definida no mapeamento de cada classe da hierarquia; Tipos suportados a Figura 53 mostra os tipos de Java que JDO e JPA do suporte;
Linguagem JPA possui a linguagem JPQL (Java Persistence Query Laguage) e JDO possui a linguagem JDOQL (Java Data Objects Query Language). Apesar de possurem suas prprias linguagens de consulta, ambas API do suporte a SQL tambm; o Case-sensitive JPQL case-sensitive. J JDOQL s faz diferena entre letras todas minsculas ou todas maisculas (lowercase/UPPERCASE); 60
o Operadores os operadores de JPQL so: Unario (+) (); Multiplicao (*) ; Division (/); Adio (+); Subtrao (); Relacionais (=) (>) (>=) (<) (<=) (<>), [NOT] BETWEEN, [NOT] LIKE, [NOT] IN, IS [NOT] NULL, IS [NOT] EMPTY, [NOT] MEMBER [OF]; e Operadores lgicos (AND, OR, NOT).
J os operadores de JDOQL so: Unario (~) (!) (+) (-); Multiplicao (*); Diviso (/) (%); Adio (+); Subtrao (-); Relacionais (>=) (>) (<=) (<) (instanceof); Igualdade (==) (=!); Booleanos AND (&) OR (|); e Condicionais AND ("&&") OR (||);
Como se pode observar, os operadores de JDOQL se aproximam muito mais dos conceitos de objetos e de programao do que JPQL, pois possui operadores semelhantes aos operadores utilizados em Java, como &&, ||, instanceof e =!, por exemplo. J JPQL possui operadores semelhantes aos de SQL, sendo bem parecida com essa linguagem de consulta; o Suporte a literais JPQL no d suporte literais do tipo Date. J JDOQL apesar da linguagem no d suporte a alguns tipos de literais, ela capaz de importar bibliotecas de Java, de forma que consegue trabalhar com quantidades maiores de tipos;
61
o Funes de agregao Tanto JPQL quanto JDOQL do suporte s funes MIN, MAX, COUNT, AVG e SUM. Todas essas funes so utilizadas por SQL; o Subqueries JPQL d suporte aos operadores utilizados em subqueries ANY, ALL, SOME, EXISTS. Esses operadores so derivados da linguagem SQL. J JDOQL utiliza funes especficas da linguagem, contains e isEmpty; o Aliases JPQL d suporte a alias e obrigatrio seu uso. J JDOQL no d suporte a alias, mas utiliza variveis; o Procedures nenhuma das linguagens suporta procedures; e o Estrutura das consultas as estruturas das consultas de JPQL e JDOQL podem ser vistas na Figura 54.
62
4.1.
Consultas
SELECT * FROM PESQUISADOR Em JDO no necessrio trabalhar com nenhuma linguagem de acesso para essa consulta, e o retorno so objetos do tipo Pesquisador, sem a necessidade de converter manualmente o resultado em objeto, como pode ser visto na Figura 55.
Em JPA j necessrio o uso de linguagem de acesso, mas tambm j retorna um objeto completo, sem a necessidade da transformao manual, que no caso da Figura 56 seria uma lista de Pesquisadores.
SELECT * FROM Artigo WHERE nota BETWEEN 7 AND 9; JDOQL no d suporte a clusula BETWEEN. Assim, a forma encontrada de realizar a consulta foi utilizando a linguagem SQL. No entanto, o retorno deixa de ser um objeto especfico, no caso Artigo, para ser um Object de Java. Sendo assim, necessrio fazer o mapeamento do resultado para o objeto desejado. Para utilizar SQL, o primeiro parmetro da funo newQuery javax.jdo.query.SQL, que especifica que a linguagem de consulta utilizada ser SQL. A Figura
57 mostra como realizar a consulta em uma aplicao que utiliza JDO.
Outra forma de realizar a consulta utilizando JDOQL neste caso seria a utilizao dos operadores <= e >=, que retornaria objetos do tipo Artigo.
JPA d suporte clusula BETWEEN, e mantm o mapeamento de dados implcito na aplicao, sendo o retorno objetos do tipo Artigo, como pode-se observar na Figura 58. 63
SELECT a.titulo, e.sigla FROM Artigo a, Evento e WHERE a.idEvento = e.idEvento Para esse tipo de consulta, possvel configurar o JDO para que os objetos sejam carregados com seus atributos primitivos, e tambm seus atributos que forem instncias de outras classes. Para isso, preciso adicionar a segunda linha da Figura 59 onde o parmetro ser o nome definido no arquivo de metadados, como se pode ver na Figura 60. Dessa forma, o resultado da consulta ser todos os Artigos onde idEvento no null, ou seja, possui um Evento a que o Artigo se relaciona, e dentro de Artigo vir o objeto evento carregado. Para obter como resultado objetos do tipo Evento carregado com os Artigos que se relacionam com ele, basta trocar Artigo por Evento e adicionar o fetch-group no mapeamento em Evento, no atributo artigos.
64
Em JPA, pode-se seguir o mesmo raciocnio de JDO, mas tambm possvel trazer os objetos Evento e Artigo separados. No segundo caso usa-se a consulta na Figura 61, e o resultado so arrays de Objects de tamanho 2 cada, onde o primeiro elemento do array um objeto do tipo Artigo e o segundo um Evento.
Seguindo o raciocnio do exemplo de JDO, tambm se pode buscar todos os Artigos com os Eventos carregados nos objetos retornados. A diferena entre JPA e JDO que, em JPA no necessrio, a configurao do fetch-group. O que se tem em JPA o fetchtype, que apenas indica se o carregamento dos atributos que so instncia de outros objetos ser feito sempre ao carregar o objeto me (EAGER) ou apenas quando ele for acessado (LAZY), que ocorre de forma transparente ao desenvolvedor e ao usurio. Desta forma, a consulta ficaria conforme a
Figura 62. Mas, alm do operador !=, JPQL tambm d suporte ao operador is/is not, que no
SELECT p.nome, a.titulo FROM Pesquisador p INNER JOIN Escreve e ON p.idPesquisador = e.idPesquisador INNER JOIN Artigo a ON a.idArtigo = e.idArtigo WHERE a.nota>9.6; Realizando essa consulta em JDOQL, o resultado ser um objeto do tipo Pesquisador, que ter um conjunto de Artigos que possuem nota superior a 9.6. Neste caso, deve ser criada uma query com a entidade Pesquisador, declarada uma varivel someArtigo do tipo Artigo e utilizado o mtodo contains de JDOQL, que busca dentro da coleo de artigos se existe algum Artigo e que esse artigo tenha nota superior a 9.6. Como se pode observar na Figura 63, a consulta se aproxima muito do pensamento de objetos.
65
H dois tipos de retorno para essa consulta: um objeto Pesquisador ou um objeto Pesquisador e um objeto Artigo. Basta acrescentar depois da clusula SELECT um y, representando Artigo. Como se pode observar na Figura 64, apesar da consulta parecer com a de SQL, no necessrio adicionar a expresso de comparao entre os id de Pesquisador da tabela Pesquisador e da tabela Artigo. A expresso se torna mais simples.
4.2.
Consideraes
Como pde ser visto na seo anterior, a estrutura de JPQL se assemelha bastante com a estrutura de SQL, porm a primeira trabalha com objetos enquanto a segunda trabalha com tabelas. J JDOQL apresenta uma estrutura mais voltada orientao a objetos, tanto por trabalhar com objetos quanto por possuir mtodos como isEmpty( ), por exemplo, e conseguir importar algumas bibliotecas. O uso das linguagens facilita o trabalho do desenvolvedor por trabalharem com objetos e retornar j objetos prontos, sem a necessidade de quebrar um objeto em atributos para montar consultas ou ter que reconstru-lo ao obter o retorno de consultas. JPQL possui muitos operadores semelhantes SQL, enquanto JDOQL possui alguns operadores utilizados em programao, como (&&) ou (||), o que refora a idia de JDOQL se aproximar mais ao conceito de trabalhar com objetos. JPA, talvez por ser mais recente, ainda se encontra em desvantagem, como no mapeamento de herana por exemplo, porm pode-se dizer que JPA e JDO se assemelham quanto a gama de conceitos relacionais que conseguem atender e do suporte a muitas propriedades do ORM. Por fim, no prximo captulo ser apresentada a concluso a respeito do trabalho desenvolvido. 66
5. Concluso
Como pode ser visto no decorrer do trabalho, as duas API oferecem uma grande facilidade no desenvolvimento de aplicaes de persistncia de dados, devido a sua padronizao e transparncia nas operaes. Grande parte do trabalho necessrio antes do surgimento delas foi retirado do desenvolvedor e vem sendo realizado pela implementao das API. E, alm disso, a portabilidade das aplicaes ficou maior. Trouxe uma maior liberdade para mudanas. No obrigatrio que a quantidade de arquivos seja menor. O que a padronizao do ORM estabelece uma forma de trabalhar com objetos, o que beneficia o desenvolvedor, e tambm a portabilidade da aplicao, por no se limitar implementao escolhida para realizar a persistncia. Outro fator positivo para a utilizao dessas interfaces que apesar de no ser necessrio o uso de linguagens de acesso a dados como SQL, essas API do suporte a esse tipo de linguagem de forma a no limitar o poder de manuseio dos dados. Ao mesmo tempo em que trs uma abstrao, em alguns casos at excluindo totalmente o uso de linguagens de BD, ele tambm possibilita seu uso. Essas API podem ser consideradas concorrentes, mas j possuem aplicaes que as utilizam juntas, de forma que elas se complementam. E as duas juntas formam uma ferramenta poderosa que poder dominar o mercado de desenvolvimento, e quem sabe definir o padro definitivo da persistncia de dados em Java.
5.1.
Contribuies
Apresentao de duas API para padronizao de persistncia em Java, com recomendaes de utilizaes, que podero auxiliar futuras implementaes de aplicaes com seus usos; e Apresentao de possibilidades de unio entre das duas API, de forma que no apenas concorrem, mas tambm podem se complementar.
67
5.2.
Limitaes
JPA d suporte apenas a BD relacionais (RDBMS). Por se tratarem de API, algumas funcionalidades previstas no desenvolvimento de JPA e JDO, desenvolvedores dependem das implementaes, que nem sempre provm todas as funcionalidades previstas nas API; As linguagens das API no do suporte a procedures;
5.3.
Trabalhos Futuros
Desenvolvimento de uma nova implementao dessas API, utilizando-as de forma complementar; Estudo sobre as mudanas na nova verso de JPA, 2.0; Estudo comparativo entre os padres estabelecidos por JPA e/ou JDO e outras ferramentas de mapeamento; e Desenvolvimento de uma ferramenta de mapeamento OR que gere a partir de um modelo lgico as classes Java j mapeadas com annotations.
68
Referncias Bibliogrficas
[Amb97] S. W. Ambler. Mapping Objects To Relational Databases. AmbSoftInc., 1997. Acessado em 11/12/2009. Disponvel em: {http://jeffsutherland.com/objwld98/mappingobjects.pdf} [Apa09a] OpenJPA. Acessado em: 11/12/2009. Disponvel em{http://openjpa.apache.org/}. [Apa09b] JDOHelper. Acessado em: 11/12/2009. Disponvel em {https://svn.apache.org/repos/asf/db/jdo/site/docs/api20/apidocs/javax/jdo/JDOHelper.html}. [ASF09a] Apache Software Foundation. JDO Implementations. Acessado em: 9/12/2009. Disponvel em {http://db.apache.org/jdo/impls.html} [ASF09b]ApacheSoftware Foudantion. Wich Persistence Specification? 07/12/2009. Disponvel em {http://db.apache.org/jdo/jdo_v_jpa.html}. [BK07] C. Bauer e G. King. Java Persistence with Hibernate. Manning, 2007. [BL06] B. Leonard. Using Composite Keys with JPA. java.net, 2006. Acessado em: 07/12/2009. Disponvel em {http://weblogs.java.net/blog/bleonard/archive/2006/11/using_composite.html}. [BO06] R. Biswas e E. Ort. The Java Persistence API A Simpler Programming Model for Entity Persistence, Sun Developer Network, 2006. Acessado em 24/11/2009. Disponvel em: {http://java.sun.com/developer/technicalArticles/J2EE/jpa/}. [BRM09] BRModelo. Acessado em: 07/12/2009. Disponvel em: {http://sis4.com/brModelo/} [Dat09a] DataNucleus and Eclipse. Acessado em 11/12/2009. Disponvel {http://www.datanucleus.org/products/accessplatform_1_1/guides/eclipse/index.html}. em Acessado em
[Dat09b] Data Nucleus - JDO Inheritance Strategies. Acessado em 11/12/2009. Disponvel em {http://www.datanucleus.org/products/accessplatform_1_1/guides/eclipse/index.html}. [Dat09c] Data Nucleus - JDO Queries. Acessado em 11/12/2009. Disponvel em: {http://www.datanucleus.org/products/accessplatform_1_1/jdo/jdoql.html} [Ecl09a] EclipseLink. Acessado em: 11/12/2009. Disponvel em {http://www.eclipse.org/eclipselink/}. [Ecl09b] EclipseLink. Acessado em: 11/12/2009. Disponvel em {http://www.eclipse.org/}. [Gla09] Glassfish - Toplink Essentials. Acessado em: 11/12/2009. Disponvel em {https://glassfish.dev.java.net/javaee5/persistence/}. 69
[Han05] J. Hanson. An Intro to Java Object Persistence with JDO. Devx.com,2005. Acessado em: 29/11/2009. Disponvel em {http://www.devx.com/Java/Article/26703/176/HTML/1}. [HGR09] S. Heider, A. Grler e J. Reisbich. Getting Started with Java Persistence API and SAP JPA 1.0, SAP AG, 2009, verso atualizada. [Hib09a] Hibernate. Acessado em: 11/12/2009. Disponvel em{https://www.hibernate.org/}. [Hib09b] Java Persistence with Hibernate. Acessado em: 11/12/2009. Disponvel em {https://www.hibernate.org/397.html}. [Jon09] B. L. Jones. Data Persistence and Java Data Objects JDO. developer.com, 2001. Acessado em: 11/12/2009. Disponvel em {http://www.developer.com/java/data/article.php/918111/Data-Persistence-and-Java-DataObjects----JDO.htm} [JPA09] JPA Specification. Acessado em: 9/12/2009. Disponvel em {http://jcp.org/aboutJava/communityprocess/final/jsr220/} [Jpo09] JPox JPA Inheritance Strategies. JPox.com. Acessado em: 29/11/2009. Disponvel em {http://www.jpox.org/docs/1_2/jpa_orm/inheritance.html}. [KS06] M. Keith e M. Schincariol. Pro EJB 3 Java Persistence API. Apress, 2006. [Mah05] Q. H. Mahmoud. Getting Started With Java Data Objects (JDO): A Standard Mechanism for Persisting Plain Java Technology Objects. Sun Developer Network, 2005. Acessado em 29/11/2009. Disponvel em: {http://java.sun.com/developer/technicalArticles/J2SE/jdo/}. [Mel09] R. S. Mello. Reviso e Dicas de Projeto Conceitual Modelo ER. Acessado em: 11/12/2009. Disponvel em {http://www.inf.ufsc.br/~ronaldo/ine5623/2-RevisaoDicasModelagemConceitual.pdf}. [MS09a] W. M. Sacramento. Introduo Java Persistence API JPA. Acessado em 24/11/2009. Disponvel em: {http://devmedia.com.br/articles/viewcomp.asp?comp=4590}. [MS09b] D. M. Silva. JPA Hibernate. PUC RJ. Acessado em: 29/11/2009. Disponvel em: {http://wiki.les.inf.puc-rio.br/uploads/2/28/JPA_-_Hibernate.pdf}. [Mys09] MySQL. Acessado em: 11/12/2009. Disponvel em {http://www.mysql.com/}. [Oco07] J. OConner. Using Java Persistence API in Desktop Applications. Sun Developer Network, 2007. Acessado em 24/11/2009. Disponvel em: {http://java.sun.com/developer/technicalArticles/J2SE/Desktop/persistenceapi/}. 70
[Ora09a] Toplink. Acessado em: 11/12/2009. Disponvel em {http://www.oracle.com/technology/products/ias/toplink/index.html}. [Ora09b] Kodo. Acessado em: 11/12/2009. Disponvel em {http://download-llnw.oracle.com/docs/cd/E13189_01/kodo/docs41/}. [Ric02] I.L. M. Ricarte. Bancos de Dados Relacionais. Unicamp, 2002. Acessado em 11/12/2009. Disponvel em {http://www.dca.fee.unicamp.br/cursos/PooJava/javadb/bdrel.html}. [Sil08] D. M. Silva. JPA Hibernate. PUC, 2008. Acessado em 24/11/2009. Disponvel em: {http://wiki.les.inf.puc-rio.br/uploads/5/50/PRDS2008.1_Modulo_6.2.pdf }. [Sil09] D.S. Silva. Camada de Persistncia de Dados: DAO e ActiveRecord. Acessado em: 9/12/2009. Disponvel em {http://manifesto.blog.br/1.5/Blog/Programacao/dao-active-record.html}. [Spe09] Speedo user manual: Edition of .jdo file(Mapping) . Acessado em: 09/11/2009. Disponvel em {http://speedo.ow2.org/doc/dev_jdo2file.html} [Sou09] Ebeam. Acessado em: 11/12/2009. Disponvel em {http://sourceforge.net/projects/ebeanorm/} [Sun09a] Sun Microsystems. Annotations . Acessado em :30/11/2009. Disponvel em {http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations .html}. [Sun09b] Sun Microsystems. Java Persistence API. Acessado em: 9/12/2009. Disponvel em {http://java.sun.com/javaee/technologies/persistence.jsp}. [Sun09c] Sun Microsystems. Java Data Objects. Acessado em: 9/12/2009. Disponvel em {http://java.sun.com/jdo/}. [Sun09d] Sun Microsystems. Java SE 1.5.0. Acessado em: 9/12/2009. Disponvel em {http://java.sun.com/j2se/1.5.0/}. [Sun09e] Sun Microsystems. Enterprise JavaBeans Technology. Acessado em: 9/12/2009. Disponvel em {http://java.sun.com/products/ejb/}. [Sun09f] Sun Microsystems. The Source of Java Developers. Acessado em: 11/12/2009. Disponvel em {http://java.sun.com/}. [Sun09g] Sun Microsystems. The Java Persistence Query Language. Acessado em 11/12/2009. Disponvel em {http://java.sun.com/javaee/5/docs/tutorial/backup/update3/doc/QueryLanguage.html} [Sun09h] Sun Microsystems. About JDOQL Queries. Acessado em: 11/12/2009. 71
Disponvel em {http://docs.sun.com/app/docs/doc/819-4721/beakd?a=view} [Sun09i] Sun Microsystems. J2SE 5.0. Acessado em: 11/12/2009. Disponvel em {http://java.sun.com/j2se/1.5.0/}. [Uni09] Banco de Dados Bsico. Unicamp, SP. Acessado em: 11/12/2009. Disponvel em {ftp://ftp.unicamp.br/pub/apoio/treinamentos/bancodados/cursodb.pdf}. [Web09a] Using and Understanding Java Data Objects. Acessado em: 9/12/2009. Disponvel em {http://book.javanb.com/using-and-understanding-java-data-objects/LiB0025.html}. [Web09b] Java Data Objects (JDO) Specification. Acessado em 9/12/2009. Disponvel em{http://jcp.org/en/jsr/detail?id=12}. [WIKI09a] Persistncia de Dados. Acessado em 30/11/2009. Disponvel em {http://pt.wikipedia.org/wiki/Persist%C3%AAncia_de_dados}. [WIKI09b]API. Acessado em 30/11/2009. Disponvel em {http://pt.wikipedia.org/wiki/API}. [WIKI09c] Mapeamento Objeto-Relacional. Acessado em: 9/12/2009. Disponvel em {http://pt.wikipedia.org/wiki/Mapeamento_objeto-relacional}. [WIKI09d] Object-relational Mapping. Acessado em: 9/12/2009. Disponvel em {http://en.wikipedia.org/wiki/Object-relational_mapping}. [WIKI09e] POJO. Acessado em: 9/12/2009. Disponvel em {http://en.wikipedia.org/wiki/Plain_Old_Java_Object}. [Web09c] Java Community Process. Acessado em: 9/12/2009. Disponvel em {http://jcp.org/en/home/index}. [XML09] Extensible Markup Language (XML). Acessado em: 11/12/2009. Disponvel em: {http://www.w3.org/XML/}.
72