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?