Java Data Objects Persistncia Transparente em Java Giuliano
Java Data Objects (Persistência Transparente em Java) Giuliano Mega Cleber Miranda Barboza 1
Sistemas de Gerenciamento de Dados Três tipos de requisitos (Ullman): Gerenciamento de Dados - operações básicas em estruturas de dados simples Gerenciamento de Objetos (JDO) - estruturas de dados mais complexas e suas operações Gerenciamento de Conhecimento - bases de regras, bancos de dados ativos, provadores de teorema, sistemas de inferência. 1
Persistência de Modelos de Objetos Necessidade Dados persistentes. Problema Aplicações geralmente são desenhadas em cima de modelos de objetos (Orientadas a Objetos). Bancos de dados relacionais representacionalmente incompatíveis com modelos de objetos (o famoso impedance mismatch). 1
Persistência de Modelos de Objetos (cont. ) Resultado Quilos de código são necessários para realizar o mapeamento Objeto-Relacional direto e inverso. Aumento de complexidade no código de aplicativos. Ineficiência. Dificuldades de manutenção (mudanças no banco = mudanças no código). Solução Modelos de persistência de objetos. Atualmente existem inúmeras formas de auxílio à persistência de modelos de objetos. 1
Gerenciamento de Objetos Algumas formas conhecidas para lidar com o problema: • Seriação • Linguagens de Programação Persistentes - Pascal/R (não OO), JVM com checkpoints • RDBMs extendidos • Ferramentas de mapeamento O/R (ex: Java. Blend) • ODBMS • Snapshotters • Persistência Ortogonal 1
JDO – Introdução O que é JDO? JDO é uma ferramenta de persistência de modelos de objetos. Nascido da JSR 12, JDO é uma especificação. JDO reúne o melhor dos mundos • Semântica de persistência quase ortogonal. • Independe da estrutura de armazenagem subjacente (existem implementações que trabalham em cima de RDBMs, ODBMS, arquivos XML, etc). • Vem lentamente se tornando um padrão de fato. 1
JDO – Introdução (Cont. ) O que JDO não é: JDO não é um banco de dados orientado a objetos. JDO não é um software, é uma especificação. Softwares podem ser compatíveis com JDO em diversos níveis. 1
JDO – Como Funciona Principais tópicos: Modelo fortemente transacional Persistência transparente Persistência por transitividade (persistence by reachability) Ciclos de vida de objetos Identidades Consultas Metadados Restrições 1
Modelo Transacional JDO é “orientado a transações”: • Objetos possuem campos persistentes • Acessos a esses campos devem ocorrer dentro de transações O que são transações? • São agrupamentos de tarefas que devem ser cumpridas em sua totalidade ou então não devem ser cumpridas (nenhuma delas). • Seguem as propriedades ACID: Atomicidade Consistência Independência Durabilidade • JDO oferece suporte a transações distribuídas. 1
Arquitetura JDO - rudimentos PM: Persistence. Manager POJO: Plain Old Java Object 1
Arquitetura JDO - elementos A arquitetura JDO se apóia em 3 elementos principais • Persistence. Manager. Factory – Constrói os objetos de acesso à estrutura de dados subjacente. • Persistence. Manager – Fornece o acesso à implementação JDO. • Transaction – Fornece os serviços de demarcação de transações. Como o JDO sabe qual porção de um Objeto deve ser persistida? • Utilizando um arquivo descritor em formato XML (feioso mas funcional). • JDO não é persistência ortogonal . 1
Arquitetura JDO – Principais Classes 1
Exemplo de código public class Pessoa { private String nome = “”; protected Pessoa() { } public Pessoa. String nome){ this. nome = nome; } Um Business Object típico. Também referido nos textos como Domain Object, Model Object, etc. public String get. Nome() { return nome; } public void set. Nome(String string) { nome = string; } } 1
Exemplo de código (cont. ) public static void main(String[] args) { Properties properties = new Properties(); properties. set. Property("javax. jdo. Persistence. Manager. Factory. Class", "com. triactive. jdo. Persistence. Manager. Factory. Impl"); properties. set. Property("javax. jdo. option. Connection. Driver. Name", "com. mysql. jdbc. Driver"); properties. set. Property("javax. jdo. option. Connection. URL", "jdbc: mysql: //localhost: 3306/giuliano"); Persistence. Manager. Factory pmfactory = JDOHelper. get. Persistence. Manager. Factory(properties); 1
Exemplo de código (cont. ) Persistence. Manager pm = pmf. get. Persistence. Manager(); Transaction tx = pm. current. Transaction(); // Abre uma transação tx. begin(); Object oid; Pessoa p = new Pessoa("Giuliano Mega"); pm. make. Persistent(p); oid = pm. get. Object. Id(p); // Finaliza a transação. tx. commit() grava o estado modificado // no banco. tx. commit(); 1
Persistência por Transitividade Lembre: “JDO persiste automaticamente quaisquer objetos acessíveis direta ou indiretamente a partir de um objeto tornado persistente. ” Isso significa que: • Um objeto “raíz” é persistido através de código JDO • O grafo de referências é persistido automaticamente. • Objetos voltam à memória conforme necessário. Resultado: • Persistência transparente a objetos do domínio. • O grau de transparência varia com o design do modelo. • Fachadas são excelente prática nessas situações. 1
Descritor de Persistência Indica à implementação JDO como persistir um objeto. Descritor para a classe Pessoa: <? xml version="1. 0" encoding="ASCII"? > <!DOCTYPE jdo SYSTEM "file: /javax/jdo. dtd"> <jdo> <package name="jdotest. model"> <class name="Pessoa" identity-type="datastore"> <field name="nome" persistence-modifier="persistent"> <extension vendor-name="triactive" key="length" value="max 100"/> </field> </class> </package> </jdo> 1
JDO - Enhancement Resta saber como o JDO associa as classes a seus descritores de persistência. Class enhancement Interface Persistence. Capable 1
Campos Persistentes Afinal, o que podem ser campos persistentes? JDO 1. 0 – obrigatório • Classes implementando a interface Persistence. Capable • Tipos primitivos em Java (int, char, String, etc) • Classes que empacotam tipos primitivos(Integer, Long, etc) • java. util. Hash. Set, java. util. Locale JDO 1. 0 – optativo • Array. List, Hash. Map, Hash. Table, Linked. List, Tree. Map, Tree. Set, Vector. • Grande parte das implementações suporta Hash. Map e Linked. List. 1
Ciclo de Vida de Objetos (1) 1
Ciclo de Vida de Objetos (2) Transições e Transações 1
Ciclo de Vida de Objetos (3) Todas as transições e estados requeridos pelo JDO 1. 0 1
Identificação de Objetos JDO prevê a identificação de Objetos por meio de dois métodos: Identidade de base de dados • A implementação JDO fornece um identificador ao objeto que independe de seus campos. • É encapsulado em um Object e dependente de implementação. Identidade de aplicativo • Classe fornecida pelo usuário é utilizada como chave primária. • Essa classe obedece a uma estrutura previsível, parecida com aquela encontrada em classes para chaves primárias em contêiners J 2 EE. 1
Herança JDO permite o uso de polimorfismo A classe base da hierarquia deve ser persistente Consultas podem devolver misturas de classes e subclasses. Supre uma das muitas deficiências do sistema de CMP em ambientes J 2 EE. 1
Consultas em JDO Três maneiras de recuperar objetos Um único objeto, através de seu identificador (exemplo no slide 14) Objetos de um tipo particular – Extents Objetos cujos campos contêm valores específicos – filtros. Linguagem de consulta JDO – JDOQL 1
Consultas JDO - Extents Extent de uma classe: Coleção de todas as instâncias daquela classe. Opcionalmente pode conter os extents das subclasses. 1
Consultas JDO - Filtros Uso de filtros Obter objetos que satisfaçam determinadas propriedades. São aplicados em extents de classes (porque não iterar então? ) Vantagens Sintaxe parecida com Java. Dispensa o uso de SQL. Mais fácil de aprender que SQL. Independe da infraestrutura de dados subjacente. 1
Consultas JDO – Filtros (exemplo) Collection get. Pessoa. Pelo. Nome (String nome. String, Persistence. Manager pm) { Extent extent = pm. get. Extent (Pessoa. class, true); String filter = “nome == nome. Para. Busca”; Query query = pm. new. Query (extent, filter); query. declare. Parameters (“String nome. Para. Busca”); query. set. Ordering (“name ascending”); return (query. execute (nome. String)); } 1
Consultas JDO - mais informações Algumas outras informações sobre JDOQL É possível abranger elementos em coleções persistentes dentro de consultas com filtros. É possível utilizar outras linguagens de consulta que não o JDOQL em JDO (nunca vi fazerem). JDOQL é eficiente. 1
JDO e EJB Especula-se uma possível substituição do CMP por JDO. O que é CMP? CMP é a sigla para Container Managed Persistence. É a maneira pela qual o container J 2 EE automatiza o gerenciamento de instâncias persistentes. Instâncias persistentes = Entity Beans. Entity Bean – duas categorias: Container-Managed Persistence (CMP) Bean-Managed Persistence (BMP) 1
Entity Beans - BMP – Bean Managed Persistence Contém código de persistência explícito, que armazena o conteúdo do bean na base de dados. Em geral não relacionam-se com outros beans. Improvável que BMP seja trocado pelo JDO, pois um BMP faz uso de direto de drivers JDBC. Isso viola o design principal do JDO. 1
Entity Beans - CMP – Container Managed Persistence A persistência é gerenciada pelo container J 2 EE. Nesse modelo, o bean não contém código de persistência JDBC (ou qualquer outro). O container trata toda a parte de armazenamento e recuperação de dados. Beans que empregam CMP podem formar relacionamentos típicos, como m: n e 1: m, com outros beans utilizando CMP's. Esses relacionamentos são gerenciados pelo container. 1
JDO e CMP O papel do CMP é muito semelhante ao do JDO. Ambos permitem persistência do modelo de objetos e não se preocupam com detalhes de como o modelo será armazenado na base de dados. Tanto JDO como CMP tratam dos relacionamentos entre objetos. CMP possui alto grau de portabilidade através dos servidores de aplicação ( A classe bean e o descritor de arquivos são padronizadas ). A implementação JDO pode variar de acordo com características opcionais de cada fornecedor. 1
JDO e CMP (cont. ) CMP: Relacionamentos gerenciáveis. Isso significa que durante uma transação, uma mudança de um lado do relacionamento imediatamente afeta o outro lado A mudança é visível para a aplicação. JDO : Não suporta relacionamentos gerenciáveis. Alguns fornecedores oferecem essa característica como opcional. 1
CMP e JDO - Herança CMP: Não comporta herança nem polimorfismo. Superclasses e subclasses não podem ser tratadas indiferenciadamente. JDO: Provê facilidades para o uso de herança e hierarquia de implementações. Subclasses podem ser utilizadas no lugar de superclasses indiscriminadamente. 1
Benchmarks 1
Onde conseguir o JDO? Implementações pagas Implementações de código aberto Solarmetric (www. solarmetric. com) Libelis (www. libelis. com) outras. Apache OJB (db. apache. org/ojb/) TJDO (www. triactive. com) JORM (www. objectweb. com) Veja também www. jdocentral. com Google – open source jdo implementation 1
Perguntas? 1
Bibliografia ROOS, Robin M. Java Data Objects. Addison Wesley, 2003. JORDAN, David. JDOQL: The JDO Query Language. em: <http: //www. jdocentral. com. br/>. MCCAMMON, Keyron. Java Data Objects: The future for Java object persistence. em: http: //www. jdocentral. com. br KORTHAUS, Axel; MERZ, Matthias. A Critical Analysis of JDO in the Context of J 2 EE. <http: //webrum. uni-mannheim. de/rz/merz/publications/1007 SE. pdf> Muitos artigos perdidos no tempo. 1
- Slides: 39