Download - 1 Java Data Objects (Persistência Transparente em Java) Giuliano Mega Cleber Miranda Barboza
1
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: JavaBlend) • 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: PersistenceManagerPOJO: Plain Old Java Object
1
Arquitetura JDO - elementos
A arquitetura JDO se apóia em 3 elementos principais• PersistenceManagerFactory – Constrói os objetos de
acesso à estrutura de dados subjacente.• PersistenceManager – 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 PessoaString nome){this.nome = nome;
}
public String getNome() {return nome;
}
public void setNome(String string) {nome = string;
}}
Um Business Object típico.
Também referido nos textos como Domain Object, Model Object, etc.
1
Exemplo de código (cont.)
public static void main(String[] args) {Properties properties = new Properties();
properties.setProperty("javax.jdo.PersistenceManagerFactoryClass", "com.triactive.jdo.PersistenceManagerFactoryImpl");
properties.setProperty("javax.jdo.option.ConnectionDriverName", "com.mysql.jdbc.Driver");
properties.setProperty("javax.jdo.option.ConnectionURL", "jdbc:mysql://localhost:3306/giuliano");
PersistenceManagerFactory pmfactory = JDOHelper.getPersistenceManagerFactory(properties);
1
Exemplo de código (cont.)
PersistenceManager pm = pmf.getPersistenceManager();Transaction tx = pm.currentTransaction();
// Abre uma transaçãotx.begin();
Object oid;Pessoa p = new Pessoa("Giuliano Mega");
pm.makePersistent(p);oid = pm.getObjectId(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/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 PersistenceCapable
1
Campos Persistentes
Afinal, o que podem ser campos persistentes? JDO 1.0 – obrigatório
• Classes implementando a interface PersistenceCapable• Tipos primitivos em Java (int, char, String, etc)• Classes que empacotam tipos primitivos(Integer, Long,
etc)• java.util.HashSet, java.util.Locale
JDO 1.0 – optativo• ArrayList, HashMap, HashTable, LinkedList, TreeMap,
TreeSet, Vector.• Grande parte das implementações suporta HashMap e
LinkedList.
1
Ciclo de Vida de Objetos (1)
Perguntas: Como o JDO gerencia a persistência de Objetos? Como a implementação sincroniza a base de dados
subjacente com os objetos em memória? Como e quando são lidos ou relidos os campos de um objeto?
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 J2EE.
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 J2EE.
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.
Extent e = pm.getExtent (Pessoa.class, true);
Iterator it = e.iterator()
while (it.hasNext()) {
Pessoa pessoa = (Customer) it.next();
System.out.pritln(pessoa.getNome());
}
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 getPessoaPeloNome (String nomeString,PersistenceManager pm)
{Extent extent = pm.getExtent (Pessoa.class, true);String filter = “nome == nomeParaBusca”;Query query = pm.newQuery (extent, filter);
query.declareParameters (“String nomeParaBusca”);
query.setOrdering (“name ascending”);
return (query.execute (nomeString));}
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 J2EE 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
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
CMP – Container Managed Persistence
A persistência é gerenciada pelo container J2EE. 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 Solarmetric (www.solarmetric.com) Libelis (www.libelis.com) outras.
Implementações de código aberto 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 J2EE. <http://webrum.uni-mannheim.de/rz/merz/publications/1007SE.pdf>
Muitos artigos perdidos no tempo.