Camada de Persistência Estudo comparativo entre EJB, JDO e Hibernate Aluno: Thiago Antônio Marafon...

Post on 07-Apr-2016

218 views 0 download

Transcript of Camada de Persistência Estudo comparativo entre EJB, JDO e Hibernate Aluno: Thiago Antônio Marafon...

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çãoCrescimento da indústria de softwaresBusca por novas técnicasProliferação das tecnologias orientadas a

objetoBancos de dados relacionais consolidadosModelos 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 objetoEliminam o problema do Impedance

MismatchFalta de padronizaçãoSistemas legados

Introdução

Camada de PersistênciaEncapsulam o banco de dadosSimulam 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

PersistenceManagerPersistenceCapableTransactionQuery, ...

JDO

Enxertador de códigoProblema crítico na especificação 1.0

Problemas com debuggingBaseia-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 dadosJDOQLSQLAtravés do OIDNavegaçãoExtent

Exemplo de seleção utilizando JDOQLQuery 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" identity-

type="application"> <field name="name" persistence-modifier="persistent“/> <field name="age" persistence-modifier="persistent“/> <field name="cpf" primary-key="true" persistence-modifier="persistent“ null-

value="exception“/> </class> </package></jdo>

Hibernate

http://www.hibernate.orgVersão utilizada: 3.0Ferramenta gratuita e código livreGrande destaque na atualidadeNão é reconhecido como padrão

Hibernate

Arquitetura básica:

Hibernate

Classes:SessionFactorySessionTransaction

Classes que podem ser extendidasTransactionFactoryConnectionProvider

Hibernate

Ciclo de vida dos objetos:

Hibernate

Identidade de objetosChave primária

Nova classe ou atributoGerenciamento

Aplicação ou HibernateAlgoritmos 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.0Grandes mudançasSimplicidade

Annotations

EJB

Arquitetura Enterprise Beans

“Objetos Java que contêm a lógica de negócio realizado e que comandam a manipulação dos dados de uma aplicação”

Aplicação Cliente-Servidor 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

EntityManagerCriar, remover, consultar, “contextos de

persistência”Ciclo de vida de um bean

NovoGerenciadoDesacopladoRemovido

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 dadosEJBQLSQLMétodos da interface “Home”, como na

versão 2.1Exemplo 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

MetodologiaClasses Java -> Banco de dados

Modelagem do problema pensando nas classes e não no meio persistente

Menor esforço para um programadorMenos conhecimento sobre banco de dados

necessário

Estudo de caso

Implementação com JPOX (JDO) Geração dos meta-dados

EclipseJDO Criação das tabelas

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

Hibernator Geração das tabelas

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 (meta-

dados) 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 arquiteturaQuanto a facilidade para

implementaçõesQuanto a transparênciaQuanto a pesquisa de dados

Problemas JDO

Análises Quanto a performance

Inserção de dados

Análises

Quanto a performanceConsulta 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 segundosHibernate 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?