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?