460 likes | 549 Views
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
E N D
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
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" 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.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 • “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 • 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 • 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 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?