Camada de Persistência
Estudo comparativo entre EJB,
JDO e Hibernate
Aluno: Thiago Antônio Marafon
Orientador: Prof. Dr. Leandro José Komosinski
Membros da Banca:
Prof Dr. Ronaldo dos Santos Mello
Prof Dr. Frank Augusto Siqueira
Tópicos

Introdução




Contextualização
Problema
Solução
Objetivos

JDO
 Hibernate
 EJB
 Estudo de caso
 Análises
 Conclusão

Trabalhos Futuros
Introdução

Contextualização
Crescimento da indústria de softwares
 Busca por novas técnicas
 Proliferação das tecnologias orientadas a
objeto
 Bancos de dados relacionais consolidados
 Modelos de dados diferentes


“Impedance Mismatch”
Introdução

Contextualização




O que é Modelo da dados?
Modelo de dados Relacional
 Tabela, Tupla, Coluna, Relacionamento, Chave
Modelo de dados orientado a objetos
 Classe, Objeto, Herança, Identidade, Métodos,
Associação
Impedance Mismatch
 Diferenças entre modelos




Identificação, relacionamentos, herança.
Dificulta o processo de desenvolvimento de softwares
Pode comprometer o desempenho
Aumento do acoplamento, dificuldades de manutenção
Introdução

Bancos de dados orientados a objeto
Eliminam o problema do Impedance
Mismatch
 Falta de padronização
 Sistemas legados

Introdução

Camada de Persistência
Encapsulam o banco de dados
 Simulam acesso orientado a objetos,
independente do tipo de banco

Introdução
Problema
Camada de Persistência minimiza os
efeitos do Impedance Mismatch
 Dentre as várias implementações
existentes, qual delas escolher?
 Padrões : JDO, EJB (Entity Beans)
 Não padrão: Hibernate

Objetivos




Compreender a importância do uso de uma camada
de persistência
Estudar e descrever aspectos mais importantes das
camadas de persistência em questão (JDO, EJB e
Hibernate)
Realizar estudo de caso (análise prática)
Comparar as ferramentas com base na experiência
adquirida.
JDO





Java Data Objects
Java Specification Request 12
Início em 1999, primeira versão em Maio de
2002.
Mais recente versão 2.0, liberada em
Fevereiro de 2005
Implementação escolhida: JPOX 1.1.0-beta-1


http://www.jpox.org
Implementação referência escolhida pela SUN
JDO

Arquitetura:

Define uma série de classes e interfaces
PersistenceManager
 PersistenceCapable
 Transaction
 Query, ...

JDO

Enxertador de código

Problema crítico na especificação 1.0

Problemas com debugging
Baseia-se nas declarações de meta-dados
 Inserção de byte-codes nos arquivos
“.class”

JDO

Ciclo de vida dos objetos



Transiente
Persistente
Identidade de objetos: Uma classe para cada
chave primária
 Limitação: subclasses devem utilizar a mesma
chave da superclasse
JDO

Seleção de dados
JDOQL
 SQL
 Através do OID
 Navegação
 Extent


Exemplo de seleção utilizando JDOQL
Query q = pm.newQuery (Empregado.class, “salario > sal”);
q.declareParameters (“Float sal”);
Collection empregados = (Collection) q.execute (new Float (1000.0));
JDO

Declaração dos Meta-Dados

Descrição através de arquivos no formato XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jdo SYSTEM "file:/javax/jdo/jdo.dtd">
<jdo>
<package name="exemplo.modelo">
<class name="Person" objectid-class="exemplo.modelo.PersonKey" identitytype="application">
<field name="name" persistence-modifier="persistent“/>
<field name="age" persistence-modifier="persistent“/>
<field name="cpf" primary-key="true" persistence-modifier="persistent“
value="exception“/>
</class>
</package>
</jdo>
null-
Hibernate
http://www.hibernate.org
 Versão utilizada: 3.0
 Ferramenta gratuita e código livre
 Grande destaque na atualidade
 Não é reconhecido como padrão

Hibernate

Arquitetura básica:
Hibernate

Classes:
SessionFactory
 Session
 Transaction


Classes que podem ser extendidas
TransactionFactory
 ConnectionProvider

Hibernate

Ciclo de vida dos objetos:
Hibernate

Identidade de objetos

Chave primária


Nova classe ou atributo
Gerenciamento
Aplicação ou Hibernate
 Algoritmos de geração de chaves

Hibernate

Seleção de dados






OID
Navegação
HQL
Criteria
SQL
Exemplos:
HQL: Query hqlQuery = session.createQuery("from Pessoa as pessoa Where
pessoa.nome = ?").setString(0,”Maria”);
SQL: Query sqlQuery = session.createSQLQuery("select {p.*} from Pessoa {p}
Where p.nome = :nome", "p",Pessoa.class).setString(“nome”,”Maria”);
Criteria: Criteria crit = session.createCriteria(Pessoa.class).add(
Restriction.like("nome", "Maria"));
Hibernate

Definição dos Meta-dados
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="br.com.hibernate.Pessoa" table="PESSOA">
<id name="id“ column="PESSOA_ID“ type="long">
<generator class="native"/>
</id>
<property name="nome" column=”NOME” type="string"/>
</class>
</hibernate-mapping>
EJB






Solução para sistemas cliente servidor
Componentes distribuídos
Padrão j2EE
Dentre as várias funções, realiza o papel de camada
de persistência (Entity Beans)
Mais recente versão completa: 2.1 (2003)
Drafts e implementações da versão 3.0 já estão
disponíveis
EJB

EJB 3.0
Grandes mudanças
 Simplicidade


Annotations
EJB

Arquitetura

Enterprise Beans


Aplicação Cliente-Servidor


“Objetos Java que contêm a lógica de negócio realizado e
que comandam a manipulação dos dados de uma
aplicação”
Funções são disponibilizadas ao cliente que realiza
requisições ao servidor
EJB

Session Beans, Entity Beans, Message-Driven Beans
EJB

Entity Beans

Visão de um conjunto de dados no banco na forma de objetos Java
Operações sobre este objeto são refletidas no banco

Entity Beans ficam contidos em um Contêiner de Beans





Persistência
Concorrência
Segurança
Controle de Transações
EJB

EntityManager


Criar, remover, consultar, “contextos de
persistência”
Ciclo de vida de um bean
Novo
 Gerenciado
 Desacoplado
 Removido

EJB

Annotations


Se parece com um comentário
Define meta-dados de um Entity Bean
@Entity
@Table(name="PESSOA")
public class Pessoa implements Serializable {
private Long id;
private String nome;
private Collection telefones;
@Id(generate=TABLE)
@Column(name=ID, primaryKey=true)
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
@Column(name="NOME", length=80)
public String getNome() { return nome; }
EJB

Annotations continuação
public void setNome(String nome) { this.nome = nome; }
@OneToMany(targetEntity="br.com.ufsc.Telefone", cascade=ALL")
@JoinColumn(name="PESSOA_ID", referencedColumnName="ID")
public Collection getTelefones() { return telefones; }
public void setTelefones(Collection telefones) {
this.telefones = telefones;
}
}
EJB

Seleção de dados
EJBQL
 SQL
 Métodos da interface “Home”, como na
versão 2.1


Exemplo de EJBQL
Query query = entityManager.createQuery(
"SELECT c FROM Clientes c WHERE c.nome LIKE :cliNome");
query.setParameter("cliNome", nome);
query.setMaxResults(10);
query.getResultList();
Estudo de caso

Problema proposto
Estudo de caso

Metodologia

Classes Java -> Banco de dados
Modelagem do problema pensando nas classes
e não no meio persistente
 Menor esforço para um programador
 Menos conhecimento sobre banco de dados
necessário

Estudo de caso

Implementação com JPOX (JDO)

Geração dos meta-dados


Criação das tabelas


EclipseJDO
SchemaTool
Problemas





Não é possível gerar os meta-dados totalmente corretos
com base nas classes Java
Não foi possível gerar as tabelas através de métodos
Incompatibilidade entre definições de meta-dados
Encapsulamento dos dados de telefones e formações
Estrutura de classes hierárquica sem garantias de
integridade (chaves estrangeiras)
Estudo de caso

Aplicação final (JDO)
Estudo de caso

Estrutura de tabelas (JDO)
Estudo de caso

Implementação com Hibernate

Geração dos meta-dados


Geração das tabelas


Hibernator
Hibernate
Problemas




Hibernator gera mapeamentos para a versão 2.1 do
Hibernate
Hibernator não gera o mapeamento para as relações de
herança
Precisou-se alterar o mapeamento gerado para a relação
entre médicos e pacientes
Foram necessárias classes para Telefone e Formação
Estudo de caso

Aplicação final (Hibernate)
Estudo de caso

Estrutura de tabelas (Hibernate)
Estudo de caso

Implementação com Entity Beans

Problemas






Documentação incompleta
Nenhum exemplo completo
Falta de suporte por parte da IDE Eclipse
Inexistência de geradores de código automático (metadados)
Sem informações quanto a geração automática de tabelas
(presente na versão 2.1)
Implementação seria mais trabalhosa do que sem
Entity Beans
Análises
Quanto a arquitetura
 Quanto a facilidade para
implementações
 Quanto a transparência
 Quanto a pesquisa de dados


Problemas JDO
Análises

Quanto a performance

Inserção de dados
Análises

Quanto a performance

Consulta de dados
Consultar dados de todos os pacientes
conveniados (nome, data de nascimento,
número do convênio, nome do convênio, cpf e
endereço)
 JDO 3.468 segundos
 Hibernate 2.656 segundos

Conclusões

EJB


Ainda não apresenta estrutura necessária para
desenvolvimento de aplicações de forma eficiente
JDO


Simples, fácil de utilizar, eficiente, problemas
críticos da especificação 1.0 resolvidos
Apresentou vários problemas


Não se mostrou confiável
Problemas relacionados à implementação (JPOX)
Conclusões

Hibernate






Abrangente, flexível
Permite grande controle sobre a aplicação
Pode funcionar de forma simples com as opções
padrão
Robusto
Perda na performance
Ferramenta equilibrada

Tanto para aplicações simples quanto para complexas
Trabalhos futuros

Análise de outras ferramentas


Ou outras versões destas mesmas
Análise de aspectos específicos de camadas
de persistência




Arquitetura de transações
Medição de desempenho
Capacidade de expressão das linguagens de
consulta
Arquitetura de gerenciamento de identidade de
objetos
Fim

Comentários?
Download

Camada de Persistência - Projetos