UFG - Instituto de Informática
Especialização em Desenvolvimento de
Aplicações Web com Interfaces Ricas
EJB 3.0
Prof.: Fabrízzio A A M N Soares [email protected] Aula 10 – Persistência de Dados
Persistência de Dados
A persistência de dados, na computação,
refere-se ao armazenamento não-volátil de dados, por exemplo, o armazenamento em um dispositivo físico como um disco rígido.
Quando se grava um arquivo no disco, por
exemplo, o dado está sendo “eternizado”, ou seja, deixa de ficar volátil na memória RAM e passa a ser escrito num dispositivo que
Persistência de Dados
Pode-se dizer que de maneira geral, o termo
persistência é associado a uma ação que
consiste em manter em meio físico
recuperável, como banco de dados ou arquivo, de modo a garantir a permanência das informações de um determinado estado de um objeto lógico.
Tipos de Persistência
Arquivo
Persistência de Dados
Na orientação a objetos, chama-se de “objetos
persistentes” aqueles que permanecem
existindo mesmo após o término da execução do programa.
Associados à persistência estão o
gerenciamento dinâmico da memória e o armazenamento de objetos em bases de dados.
Persistência de Dados
Somente é possível “eternizar” um objeto
quando este não possui “dados dinâmicos” (runtime), ou seja, dados que só fazem sentido no contexto do tempo em que estão executando, como sockets, por exemplo.
Os objetos que possuem dados de tempo de
execução, se congelados, após sua
Persistência e mapeamento O/R
Como sabemos, a tecnologia de banco de
dados relacionais existe há décadas, e hoje os SGBDs são robustos e confiáveis.
Os principais problemas relacionados ao
armazenamento e recuperação de dados já foram solucionados, e o investimento das empresas nesses sistemas também é imenso, o que torna a sua utilização uma regra.
Persistência e mapeamento O/R
O uso dos bancos de dados relacionais, no
entanto, traz alguns inconvenientes ao desenvolvedor em linguagens orientadas a objetos como Java.
As tecnologias OO e relacional são bastante
diferentes, e seu uso conjunto normalmente implica em enfatizar uma tecnologia em sacrifício da outra.
Persistência e mapeamento O/R
Como os bancos de dados OO ainda estão
muito menos disseminados que os bancos de dados relacionais, o desafio atual dos
desenvolvedores é unir dois mundos
completamente distintos, utilizando a
Persistência e mapeamento O/R
O armazenamento de objetos de uma
aplicação é denominado persistência de objetos.
Essa técnica permite que as instâncias
existentes no sistema sejam armazenadas e posteriormente recuperadas, conservando-se o seu estado mesmo após a aplicação ter sido finalizada.
Abordagens atuais de mapeamento
Desde as suas primeiras versões, a plataforma
Java oferece acesso a bancos de dados através da API JDBC, que trabalha no mesmo nível do banco, sendo o acesso às informações armazenadas feito através de comandos SQL.
Abordagens atuais de mapeamento
Em muitos aspectos, a JDBC é uma API de baixo
nível, que muitas vezes exige do desenvolvedor o conhecimento das “nuances” do banco de dados.
Apesar de ser uma maneira eficiente de acessar
dados em SGBDs relacionais, e a opção que normalmente oferece melhor performance, a JDBC oferece uma abstração OO bastante limitada
Trabalha-se com Tabelas, Registros e ResultSets, ao
Abordagens atuais de mapeamento
Para usar os recursos de bancos de dados relacionais
em Java e ainda assim aproveitar os conceitos do paradigma OO, é necessário fazer o que se conhece como mapeamento Objeto-Relacional (ou simplesmente mapeamento O/R).
No mapeamento O/R as classes e os atributos do
sistema são mapeados para tabelas e campos/colunas, e a persistência é feita de forma transparente pela aplicação.
Abordagens atuais de mapeamento
Assim, objetos em memória são armazenados
no banco, e objetos do banco são trazidos para a memória sempre que necessário.
Com paradigmas tão diferentes, essas
questões surgem durante o mapeamento:
Como mapear herança? E agregação?
Abordagens atuais de mapeamento
Para suprir essas necessidades, surgiram ersos
frameworks e tecnologias de persistência, a exemplo do Hibernate e do iBatis.
Essas ferramentas facilitam o trabalho do
desenvolvedor e aumentam sua produtividade, fornecendo poderosas APIs de manipulação de dados.
Apesar de cada ferramenta possuir uma forma distinta
Abordagens atuais de mapeamento
O termo Plain Java Old Object (ou
simplesmente, POJO) foi criado por Martin Fowler, Rebecca Parsons e Josh MacKenzie em 2000.
A tradução é semelhante a “velho e bom objeto
Java” e refere-se a objetos/classes Java simples, não atrelados a ferramentas ou frameworks
JPA – Java Persistence API
Até o J2EE 1.4 a plataforma Java não possuía uma
forma simples de mapear objetos no banco de dados.
A única opção era a utilização de Entity Beans, que
exigem um container EJB e possuem uma complexidade razoável.
Aplicações cuja arquitetura não envolvia EJBs
precisavam utilizar ferramentas não padronizadas como o Hibernate para fazer a persistência, ou fazer a implementação de persistência manualmente.
JPA – Java Persistence API
A Java Persistence API, definida na JSR-220
(Enterprise JavaBeans,Version 3.0), padroniza o mapeamento objeto-relacional na plataforma Java.
Apesar de descrita na especificação do novo EJB, a
JPA não depende de um container para funcionar, sendo possível usar e testar soluções apenas com o Java SE.
JPA – Java Persistence API
A JPA é uma especificação baseada no conceito de
POJOs, que incorpora idéias de renomados frameworks de persistência para padronizar o mapeamento O/R em Java.
A API oferece uma solução completa para
mapeamento e persistência de objetos:
Um modo declarativo de descrever mapeamentos
JPA – Java Persistence API
Em se tratando de um padrão do Java
Community Process, a JPA traz ersos benefícios.
O uso de um padrão para a persistência de
objetos permite que ersos fabricantes
trabalhem sobre os mesmos conceitos e que o desenvolvedor escolha a implementação de sua preferência.
JPA – Java Persistence API
A padronização também traz outra importante
vantagem:
pode-se alternar entre implementações de
fabricantes distintos, que estejam em conformidade com a JSR-220, sem nenhum esforço adicional.
Dessa forma, uma aplicação codificada de acordo
com o novo padrão irá funcionar com qualquer implementação da JPA, não havendo necessidade de se conhecer (a princípio) qual tecnologia será utilizada
Conceitos Básicos
Na JPA os objetos persistentes são
denominados entidades (entities).
Uma entidade é um objeto simples (POJO),
que representa um conjunto de dados persistido no banco.
Como entidades são definidas por classes Java
comuns, sem relação com frameworks ou bibliotecas, elas podem ser abstratas ou herdar
Conceitos Básicos
Um conceito importante é que as entidades
possuem um identificador (descrito pela chave primária) e estado, sendo seu tempo de vida independente do tempo de vida da aplicação.
Assim, aplicações distintas podem compartilhar
a mesma entidade, que é referenciada através de seu identificador.
Conceitos Básicos
Para que uma entidade se torne persistente é
necessário associá-la a um persistence context (“contexto de persistência”), que fornece a conexão entre as instâncias e o banco de dados.
A manipulação das entidades é feita, a partir desse
contexto, por meio do entity manager (“gerenciador”), que é responsável por executar as operações básicas sobre a entidade (criação, atualização, exclusão, localização, consultas etc.).
Conceitos Básicos
A implementação da JPA é feita por um persistence
provider (“provedor”).
O provedor define “como as coisas funcionam”,
através da implementação de todas as interfaces definidas pela especificação da JPA.
Dessa forma, cada provedor decide a maneira e o
momento de carregar, atualizar e armazenar as entidades, assim como sincronizar os dados com o banco.
Conceitos Básicos
As configurações utilizadas pelo provedor em uma
determinada aplicação (conexão com o banco de dados, entidades que serão gerenciadas, tipo de transação etc.) são descritas em uma persistence unit, que é configurada num arquivo especial denominado persistence.xml.
Mapeamento
As classes e interfaces da JPA estão
localizadas no pacote javax.persistence.
A API faz uso intensivo de anotações; por isso
não é necessário criar descritores XML para cada uma das entidades da aplicação.
Uma entidade é uma classe Java comum,
Mapeamento
Não é necessário implementar interfaces ou
estender outras classes para tornar uma classe “persistível”;
A única exigência é que a classe da entidade
possua um construtor sem parâmetros, pois a instanciação da classe é feita por reflexão.
Mapeamento
As classes e interfaces da JPA estão
localizadas no pacote javax.persistence.
A API faz uso intensivo de anotações
por isso não é necessário criar descritores XML
Mapeamento
Uma entidade é uma classe Java comum,
rotulada através da anotação @Entity.
Não é necessário implementar interfaces ou
estender outras classes para tornar uma classe “persistível”
a única exigência é que a classe da entidade
possua um construtor sem parâmetros, pois a instanciação da classe é feita por reflexão.