Your SlideShare is downloading. ×
Workshop Hibernate Com Comentarios
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Workshop Hibernate Com Comentarios

5,026
views

Published on

78 slides que dão uma visão geral sobre o hibernate, que é um framework de mapeamento objeto-relacional para java. os colaboradores da 3Layer Tecnologia, parceiros da JBoss, dão suporte nessa área.

78 slides que dão uma visão geral sobre o hibernate, que é um framework de mapeamento objeto-relacional para java. os colaboradores da 3Layer Tecnologia, parceiros da JBoss, dão suporte nessa área.

Published in: Technology

1 Comment
2 Likes
Statistics
Notes
  • Marcelo, excelente material. Pena que, mesmo em full screen, teve algumas coisas que não consegui ler por completo (talvez fosse até a real intenção em proteger o conteúdo).
    De qualquer forma, foi muito completo, útil e com ótima qualidade. Obrigado por compartilhar, parabéns.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
5,026
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
422
Comments
1
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. www.3layer.com.br www.3layer.com.br Hibernate Uma visão geral sobre o framework padrão de fato para mapeamento objeto-relacional Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 1 de 78 mapeamento objeto-relacional Autoria e Conteúdo AUTOR: Marcelo Mrack – mmrack@gmail.com. 3Layer Tecnologia, Porto Alegre, RS – Brasil. http://www.3layer.com.br, 2006. CONTEÚDO: Apresentação sobre o framework Hibernate Sobre os Direitos Autorais Essa apresentação pode ser copiada e impressa, sendo que qualquer parte de seu conteúdo pode ser reutilizada em outras obras, públicas ou privadas. Em qualquer caso é necessário manter a referência para o autor acima identificado. É expressamente proibida a exibição em público desse documento, seja na forma de palestra, workshop, feira ou qualquer outro evento similar sem o consentimento do autor. 1
  • 2. www.3layer.com.br Sobre o autor Marcelo Mrack, mmrack@gmail.com 29 anos, 8 em TI, 6 em Java Bacharel em C. Computação, UNISC – 2001 Mestrando em C. Computação, UFRGS – 2006 Atuação em projetos web e desktop n camadas Sócio e arquiteto na 3Layer Tecnologia Projetista na CWI Software Consultor e instrutor Hibernate, Java EE Especialidades: IHC, Patterns, geradores, PU Ágil e UML http://merlin.dev.java.net http://telasdecadastro.blogspot.com Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 2 de 78 mapeamento objeto-relacional Sobre o autor Informações sobre o autor do documento e orador. 2
  • 3. www.3layer.com.br Sumário Visão geral Características gerais Arquitetura Funcionamento Associações, coleções e herança Cache HQL Outras características Ferramentas e utilitários Dicas Comentários finais Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 3 de 78 mapeamento objeto-relacional Sumário Essa apresentação visa cobrir os aspectos mais essenciais do framework de mapeamento objeto relacional Hibernate, além de fazer comentários sobre sua utilização e dicas para o desenvolvimento de aplicações. Os assuntos a serem cobertos estão listados nesse Sumário. 3
  • 4. www.3layer.com.br Visão geral O Hibernate é um framework de mapeamento objeto-relacional para a linguagem Java Conjunto de classes, interfaces e configuração que permite simplificar o trabalho de persistir e recuperar objetos Java em banco de dados relacionais Hibernate, funcionamento básico Aplicação Mapeamento Banco de dados API Hibernate JDBC Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 4 de 78 mapeamento objeto-relacional Visão geral O Hibernate (http://www.hibernate.org) é um framework para mapeamento objeto-relacional para a linguagem Java. Na prática, ele é um conjunto de classes, interfaces e arquivos de configuração pré-acabados que permitem a criação de uma camada de serviço capaz de abstrair a existência do banco de dados para sistemas Java. Funcionamento básico Seu processo de funcionamento é simples: Na aplicação Java existe um conjunto de objetos (instâncias de classes Java) que devem ser persistidos em um meio durável, no caso o banco de dados. O banco de dados nesse caso segue o modelo relacional (tabelas + relacionamentos) e por esse motivo diz-se que existe uma impedância entre essas camadas (objetos, propriedades e associações na aplicação; tabelas, colunas e relacionamentos no banco de dados). O Hibernate atua entre essas camadas, provendo funcionalidades para salvamento e recuperação dos objetos Java no banco de dados. Para a aplicação Java persistir esses objetos, ela invoca métodos da API do Hibernate. O Hibernate mapeia esses comandos para os respectivos comandos SQL do banco de dados. Esses comandos são executados sobre uma conexão JDBC normal previamente configurada no Hibernate. Para recuperação dos objetos, a aplicação cliente invoca métodos da API do Hibernate que também são traduzidos em comandos SQL do banco de dados, mas agora para seleção de registros. Utilizando essa abordagem, além de permitir isolamento da aplicação em relação ao banco de dados, o Hibernate habilita a independência de banco de dados, uma vez que a aplicação cliente não possui comandos SQL dentro de seu código. Importante ainda é o fato que todos os comandos SQL gerados pelo Hibernate são nativos do banco de dados corrente. 4
  • 5. www.3layer.com.br Degustação Um exemplo simples de uso do Hibernate Persistência... NotaFiscal Cliente Endereco 1 NotaFiscal nf = new NotaFiscal(); numero:int 2 nf.setNumero(numero); ... Item Cidade 3 //...outros setters... 4 Produto Estado 5 Session session = HibernateUtil. 6 getSessionFactory().getCurrentSession(); 7 Fornecedor Estoque Pais 8 session.beginTransaction(); 9 session.save(nf); Produtos Local 10 session.getTransaction().commit(); ... ... ... Recuperação... 1 Session session = HibernateUtil. 2 getSessionFactory().getCurrentSession(); 3 NotaFiscal nf = (NotaFiscal) session.load(NotaFiscal.class, 1001); Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 5 de 78 mapeamento objeto-relacional Degustação Nesse pequeno exemplo, um simples uso do Hibernate. Persistência Seja um objeto do tipo NotaFiscal. Deseja-se persistir esse objeto Java em uma base de dados relacional. Na aplicação cliente, o código é como da listagem superior. É instanciado um objeto NotaFiscal e suas propriedades são definidas através dos métodos setters. Através de chamadas da API do Hibernate, a fábrica de sessões de trabalho disponibiliza uma sessão para a aplicação cliente. Essa sessão é usada para persistir o objeto NotaFiscal através do método save(). Nota-se que a chamada ao método save() está encapsulada dentro de uma transação do Hibernate. Isso é um requisito importante e obrigatório. Agora, suponha-se o caso que o objeto NotaFiscal possuísse ligações com diversos outros objetos, como Cliente, Item de nota, Produto, etc. Qual seria o impacto no código da aplicação para persistir todo esse grafo de objetos? A resposta é nenhum. O Hibernate pode encarregar-se de executar a persitência de todos esses objetos relacionados (obviamente isso vai depender do tipo de configuração aplicada sobre cada um desses objetos dependentes). Recuperação Finalmente, para recuperação do objeto salvo (na mesma ou em outra sessão de trabalho do usuário), o código também é simples. Obtida uma sessão de trabalho do Hibernate, basta invocar o método load(), passando como parâmetros o tipo da classe e o identificador (chave primária, por assim dizer) do objeto. O retorno, após uma simples conversão é atribuído ao objeto NotaFiscal. Também aqui, as dependências de objetos (Cliente, Endereço, etc.) poderiam ser carregadas junto automaticamente, dependendendo do tipo de configuração adotada. Transações gerenciadas Importante é o fato que o encapsulamento de comandos (como o save() ) sob transações pode ser executado de forma transparente. Isso é possível quando o Hibernate é executado como serviço dentro de ambientes gerenciados em servidores de aplicação Java EE, como o JBoss. Isso será visto depois. 5
  • 6. www.3layer.com.br Histórico O início Concepção no final de 2001 Projeto pessoal, de Gavin King na Cirrus Technologies, AU Descontentamento com o modelo J2EE CMP A evolução jul/2002 - versão 1.0 inicialização tardia jan/2003 – versão 2.0 dialeto Oracle 9 jul/2004 – versão 3.0 net.sf.hibernate > org.hibernate adequação EJB3 (JSR220) nov/2006 – versão 3.2.1 release corrente Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 6 de 78 mapeamento objeto-relacional Histórico O projeto Hibernate é de autoria de Gavin King, um desenvolvedor Java que estava insatisfeito com o modelo CMP de persistência do J2EE 1.3. Descontente com o paradigma da época, propos-se a desenvolver um framework próprio, que condizia com as necessidades suas e de seus amigos. Por incrível que pareca, ele apostou com seu chefe (gerente de projeto) que conseguiria fazer algo melhor que o CMP do J2EE. Isso foi o começo, lá pelos idos do ano 2001 na Austrália. Evolução Ao longo dos anos e dos constantes releases da ferramenta no repositório sourceforge (www.sourceforge.net), várias funcionalidades foram sendo adicionadas e desenvolvedores associando-se ao projeto. De importante impacto foi a versão 3.0 da ferramenta, onde a revisão do padrão CMP do J2EE estava em desenvolvimento. Nesse momento, as idéias do framework Hibernate já estavam bem alicerçadas e difundidas pelo planeta. Nesse sentido, o sr. King fora incluído como membro do JCP da Sun (e parceiros) como um engenheiro especialista e praticamente definiu as bases no novo modelo CMP do Java EE 1.5 (JSR 244). O Hibernate que não fora baseado em nenhum padrão acabara de criar um: o Java Persistence API (parte da JSR 220 ou EJB3). Atualmente (dez/2006), a versão corrente do Hibernate (3.2.1) é bastante estável, escalável, customizável e aderente às necessidades de desenvolvedodres cliente/servidor e N camadas. 6
  • 7. www.3layer.com.br Características gerais Abordagem totalmente OO Suporte à mais de 20 SGBD Gera comandos SQL nativos para cada SGBD Suporte total ao Java 1.5 Opera em ambientes standalone e sob containers Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 7 de 78 mapeamento objeto-relacional Características O Hibernate objetiva dar ao desenvolvedor a possibilidade de trabalhar de forma totalmente orientada a objetos – não pensa-se mais em linhas, colunas e tabelas, mas sim em objetos, associações e coleções. Tendo engines específicas de geração de comandos SQL, o Hibernate conta atualmente com o suporte à mais de 20 banco de dados – em outras palavras, ele pode ser usado em cada um desses SGBDs executando comandos SQL nativos. Não obstante, como a aplicação cliente opera sobre sua API, a troca de um SGBD por outro não afeta a camada cliente do sistema (não é necessário reescrever o código do sistema) Na versão 3, o Hibernate adequou-se à sintaxe 1.5 do Java, suportando enumerações, coleções tipadas, anotações e outros recursos avançados dessa linguagem. Quanto ao funcionamento, o serviço do Hibernate pode operar de forma standalone (o Hibernate roda dentro da aplicação cliente) ou gerenciada (o Hibernate roda dentro de containers Java EE, como o JBoss). Detalhes sobre isso, a seguir. 7
  • 8. www.3layer.com.br Características gerais Alta Performance 2 Níveis de Cache SQL Nativo Comandos pré-compilados Queries nativas com mapeamento automático Suporte à transações Standalone, demarcadas explicitamente Gerenciada por container (XA-Transactions), implícitas Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 8 de 78 mapeamento objeto-relacional Performance Objetivando escalabilidade, o Hibernate possui um eficiente sistema de cache de 2 níveis (ambos em memória RAM). Seus comandos SQL nativos podem ser gerados tanto em tempo de execução (durante a chamada do cliente) quanto em tempo de deployment (o padrão) e são compilados no BD através de chamadas preparadas no driver JDBC. Importante salientar que, embora o Hibernate ofereça uma API de busca e persistência de objetos e uma linguagem própria de consultas (a HQL, discutida a seguir), ele também permite a execução de comandos SQL nativos diretamente pelo desenvolvedor. Mesmo esses comandos SQL nativos podem contar com os recursos de materialização automáticos, ou seja, as colunas retornadas pelo comando SQL podem ser mapeadas diretamente e automaticamente para as propriedades dos objetos da aplicação. Tudo isso é configurável Transações O Hibernate exige que qualquer comando de alteração de objetos (insert, update, delete) seja encapsulado em uma transação. Quando ele é usado na forma Standalone (em aplicações cliente-servidor, por exemplo), é tarefa do programador demarcar o início e o fim das transações (como apresentado anteriormente). Já em ambientes gerenciados (dentro de servidores de aplicação), o Hibernate pode delegar a demarcação das transações para o próprio container. Isso é possível graças a sua aderência ao padrão JTA (Java Transaction API). Quando isso é feito, o código que usa o Hibernate não precisa abrir o fechar transações, ele simplesmente invoca os métodos de persistência. O container detecta as operações em execução e automaticamente encapsula-as em transações XA (*). Por outro lado, caso o desenvolvedor não queira utilizar o padrão JTA dentro de um container, ele pode informar isso via configuração e continuar demarcando suas transações explicitamente. Nota-se que isso não é recomendado, devido a complexidade que pode estar envolvida (ambientes complexos, cluster de servidores, fail over, múltiplos databases, etc.) (*) Transações XA são um padrão de transações do JTA que permitem funcionalidades como clusterização e replicação em ambientes complexos. Nota-se que essas transações exigem recursos diversos do container (cache, segurança, replicação, etc.) e, principalmente o suporte dos drivers JDBC. Muitos drivers JDBC não suportam esse tipo de operação e, nesse caso, as transações XA são substituídas por transações mais simples. Para mais informações sobre transações em Java, consulte: 1. http://www.onjava.com/lpt/a/792 2. http://www.onjava.com/lpt/a/852 3. Capítulo sobre transações no Java EE Tutorial, em http://java.sun.com/javaee/5/docs/tutorial/doc/ 4. JSR 907 (JTA) - http://www.jcp.org/en/jsr/detail?id=907 5. http://java.sun.com/products/jta/ 8
  • 9. www.3layer.com.br Características gerais Linguagem própria de consulta HQL Semelhante ao SQL Orientada a Objeto Muitas funcionalidades embutidas Configuração flexível XML Texto puro (arquivo .properties) Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 9 de 78 mapeamento objeto-relacional HQL Uma funcionalidade importante oferecida pelo Hibernate é a linguagem HQL (Hibernate Query Language) que suporta recuperação de objetos via uma sintaxe muito semelhante ao SQL, sendo, porém, orientada a objetos. A HQL é discutida em mais detalhes a seguir. Configuração A configuração do Hibernate é dada por arquivos XML (que definem o comportamento do serviço e os aspectos relativos ao mapeamento objeto-relacional) e por arquivos texto, que definem aspectos do serviço. Os arquivos texto podem ser suprimidos quando todas as informações necessárias estão contidas nos arquivos XML. Entretanto, o uso do arquivo texto é mais simples e menos prolixo, sendo suportado em qualquer situação. Dentro do pacote de instalação do Hibernate existe um arquivo texto de modelo que pode ser utilizado para os casos mais tradicionais de configuração. Os arquivos XML são um pouco mais complexos e sensíveis ao contexto de uso (standalone ou gerenciado) e por isso é necessário uma leitura da documentação do framerwork para maiores detalhes. 9
  • 10. www.3layer.com.br Características gerais Ferramentas e utilitários disponíveis Utilitários Geração/atualização da BD Validação da BD Plugins para IDEs Operação visual Engenharia reversa (geração das classes Java a partir da BD) Software livre Grande comunidade Apoiado pela JBoss (RedHad) Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 10 de 78 mapeamento objeto-relacional Ferramentas O pacote do Hibernate representa o kernel de mapeamento, mas também possui alguns utilitários inclusos, tanto para a geração automática da base de dados, como para sua atualização e validação. Ferramentas e plugins para IDEs estão disponíveis através de outros downloads do site do projeto, as quais permitem operação visual e engenharia reversa. Outras características O Hibernate é um projeto Open Source, mantido por desenvolvedores diversos ao redor do mundo. Apoiado pela JBoss, que recentemente foi adquirida pela Red Hat, é uma solução robusta e que possui suporte dessa empresa, caso o cliente necessite (nesse caso, o suporte é pago). Treinamentos e cursos (com certificação) estão disponíveis na JBoss e também em empresas diversas em vários países. Também tutorais, fóruns, listas de discussão e amplo material de pesquisa e exemplos de sucesso estão espalhados pela Internet. 10
  • 11. www.3layer.com.br Arquitetura Arquitetura-base do Hibernate Hibernate, arquitetura-base Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 11 de 78 mapeamento objeto-relacional Arquitetura-base Na visão mais simplista, a arquiteteura do Hibernate resume-se nessa figura. Ao topo, a aplicação do cliente, com sua interface de usuário e regras de negócio bem como com os objetos a serem persistidos e as chamadas da API do Hibernate. Transitando entre essa camada e o serviço do Hibernate estão os objetos a serem persistidos. Na camada do Hibernate, que é um serviço, estão sua configuração de execução (dada pelo arquivo texto de propriedades e algum possível XML) e os arquivos de mapeamento, que definem o comportamento do mapeamento objeto-relacional. Por padrão, esse arquivos de mapeamento são escritos em XML (mas podem ser substituídos por anotações – JSR175, como será visto adiante). Na parte de baixo, o banco de dados, que efetivamente persiste os dados (objetos traduzidos em tabelas pelo Hibernate). Geralmente, essa configuração é usada em aplicações cliente-servidor (tanto desktop: swing+hibernate+bd; e web: jsp+hibernate+bd+servidor web, como o Tomcat ou Jetty). 11
  • 12. www.3layer.com.br Arquitetura A configuração completa Hibernate em configuração completa Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 12 de 78 mapeamento objeto-relacional Arquitetura completa Na configuração completa, geralmente utilizada em ambientes gerenciados, o Hibernate se parece com essa figura. Na parte de cima, o código cliente (que pode ser páginas JSP, um Webservice, uma aplicação desktop, etc.) com seus objetos a serem persistidos. No container Java EE está o serviço do Hibernate, que é fragmentado em partes: 1. A SessionFactory que é responsável por inicializar o serviço do Hibernate com base na configuração associada e ligá-lo aos recursos do container, como o JNDI, o JDBC e o JTA. 2. A Session, que é obtida através de uma chamada à fábrica de sessões. Sessions são utilizadas pela camada cliente para execução dos métodos de persistência e recuperação dos objetos. 3. O serviço de transações do Hibernate delega o uso de transações à fábrica de transações, que pode ou não utilizar o JTA (conforme configuração) 4. O ConnectionProvider do Hibernate é encarregado de obter as conexões do pool de conexões JDBC oferecido pelo container e a SessionFactory liga essas conexões a sessão de trabalho do usuário. Na parte de baixo, o banco de dados. 12
  • 13. www.3layer.com.br Modos de operação São dois os modos de operação do Hibernate Standalone Comum para sistemas 2 camadas (desktop ou web). Nele, o Hibernate controla todo o escopo de operação, e a aplicação cliente tem domínio completo da execução do sistema Gerenciado Comum para sistemas n camadas. Nele, o Hibernate é configurado como um serviço no Servidor de Aplicação, e a aplicação cliente solicita serviços do framework Standalone (API Hibernate) Gerenciado (API Java EE) Aplicação Aplicação Container Hibernate Hibernate BD BD Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 13 de 78 mapeamento objeto-relacional Modos de operação Aqui, são mostrados o uso standalone e gerenciado do Hibernate. Standalone No modo Standalone, o cliente invoca diretamente métodos da API do Hibernate, que então encarrega-se de acessar o BD. Transações são marcadas explicitamente pelo usuário. Aqui, o código cliente depende da API do Hibernate. Gerenciado No modo Gerencaido, o cliente invoca (ou pelo menos é o recomendado invocar) métodos da API de persistência do Java (JSR220), que está disponível no container Java EE. Esses métodos são delegados ao Hibernate que faz o acesso ao banco de dados (*). Essa configuração permite que o container Java EE substitua o Hibernate por outro framework de mapeamento e o cliente continue operando sem maiores complicações (ou seja, sem reescrita de código). (*) Na verdade, o que acontece é que o padrão Java Persistence (JSR220) é uma fachada de classes e interfaces, mas sem uma implementação de fato. O Hibernate implementa essa fachada. Assim, o cliente invoca métodos da fachada Java Persistence e é por isso que ele tem independência de framework de mapeamento. Substituir o Hibernate por outro framework é uma tarefa mais simples com essa abordagem. 13
  • 14. www.3layer.com.br Funcionamento Em suma, o funcionamento do Hibernate é: 1. Para cada objeto do sistema, existe uma configuração de mapeamento, na forma: classe <> tabela propriedade <> coluna | relacionamento 2. Para cada base de dados, existe um arquivo de configuração que define: Parâmetros de conexão Pool Comportamento padrão etc. 3. Para persistir e recuperar objetos, a aplicação utiliza sua API Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 14 de 78 mapeamento objeto-relacional Funcionamento Três são os passos necessários para utilizar o Hibernate: 1. Criar os arquivos de mapeamento, que definem, em suma relações entre classes e tabelas e entre propriedades e colunas ou relacionamentos. 2. Definir o arquivo de configuração do serviço, que engloba informações como valores de conexão, usuário, senha, tamanho do pool, sintaxe do banco de dados e outros. 3. Criar a aplicação cliente que utiliza a API do Hibernate para persistir e recuperar objetos na base de dados. 14
  • 15. www.3layer.com.br Modelo de desenvolvimento O processo de desenvolvimento com o Hibernate pode ser de duas formas: TopDown: Modela-se OO e gera-se a base Modela-se as classes do sistema Cria-se os arquivos de mapeamento e configuração Gera-se a base de dados Usa-se a API para persistir e recuperar objetos BottomUp: Dada uma BD existente, geram-se os artefatos Efetua-se a engenharia reversa de uma BD via plugin Hibernate Tools, gerando-se: – classes Java, arquivos de mapeamento e configuração Ajusta-se o mapeamento, as classes e a configuração (se necessário) Usa-se a API para persistir e recuperar objetos Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 15 de 78 mapeamento objeto-relacional Modelo de desenvolvimento Duas são as formas de desenvolver aplicações com o Hibernate: TopDown É o mais recomendado para aplicações criadas “do zero”, ou seja, sem uma base de dados pré-existente. Nesse tipo de desenvolvimento, a modelagem e construção do sistema segue os padrões OO. Uma vez criadas e definidas quais classes devem ser persistidas, é aplicado o processo de mapeamento, seja através do XML ou com anotações sobre essas classes (ambos processos podem ser automatizados com ferramentas visuais, como o plugin Hibernate Tools; com o uso de máquinas de template, como o Velocity; com scritps de construção, como o Ant; com o uso de IDEs inteligentes, como o Eclipse e seus templates de código ou através da tecnologia MDA, como o AndroMDA). Mapeadas as classes, os utilitários de geração do prórprio Hibernate podem gerar a DDL do banco de dados, tanto para sua criação como para atualização (incremental somente). Feito isso, cria-se a camada cliente, que utiliza a API do Hibernate para persistir e recuperar os objetos do sistema. Esse modelo pode ser incremental (e geralmente o é) e escala bem para vários ambientes. BottomUp Aqui, presume-se a existência de uma base de dados legada e deseja-se criar uma nova camada cliente, reusando as tabelas e relacionamentos existentes no BD. Nesse caso, podem ser utilizadas ferramentas de engenharia reversa o próprio Hibernate Tools (plugin do Eclipse) ou o Middlegen (utilitário para geração de artefatos a partir da base de dados) para gerar os arquivos de mapeamento, as classes Java de persistência, bem como a configuração-base do serviço do Hibernate. Com o correto ajuste das informações geradas, é possível fechar o roundtrip de desenvolvimento e assim utilizar a API do Hibernate para persistir e recuperar objetos na base de dados. IMPORTANTE é salientar que a abordagem BottomUp não é recomendada para desenvolviementos novos. Ou seja, não é recomendável em um projeto novo criar o modelo ER (com uma ferramenta como o ERWin, por exemplo) e depois aplicar uma engenharia reversa sobre a base de dados para então gerar as classes Java do sistema. Isso porque muita informação (semântica de negócio) é perdida nesse processo e as classes geradas deixam de representar o conceitos reais da aplicação em construção. É mais interessante incentivar a cultura da modelagem e projeto OO, pois como o próprio nome diz, trasta-se de um framework de mapeamento Objeto-Relacional e não Relacional-Objeto! 15
  • 16. www.3layer.com.br Classes de persistência O Hibernate não força nenhuma regra sobre os objetos a serem persistidos, porém, algumas práticas são “fortemente” recomendadas: Seguir o modelo POJO, onde: Construtor vazio, no mínimo com visibilidade de pacote Métodos getters/setters públicos padrões – (nada além de return this.x e this.x = x) Fields não públicos Providenciar um atributo identificador (ID) Não usar classes final Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 16 de 78 mapeamento objeto-relacional Classes de persistência O Hibernate não exige nenhuma regra sobre as classes a serem persistidas. Não é preciso estender nenhuma classe, nem implementar interfaces ou seguir padrões, porém... ...é fortemente recomendado seguir algumas diretrizes, que visam, objetivamente, aumentar a performance, a escalabilidade, a independência e a facilidade de uso de todo o sistema. As diretrizes são simples: 1. Seguir o modelo POJO (Plain Old Java Objects), que também é uma diretriz para a Java Persistence API; 2. Providenciar um atributo identificador para a classe; 3. Não declarar classes FINAL, uma vez que benefícios da instrumentação de código (como otimização de acesso) não vão estar disponíveis. Dito isso, nada mais espera-se das classes de persistência. 16
  • 17. www.3layer.com.br O processo de mapeamento A configuração do mapeamento OO-ER é feita por classe, através de: Usando anotações XML Anotações (JSR175) (exige pacote extra) Hibernate, mapeamento de classes Usando XML @MinhaClasse classe=tabela @ id:long XML propriedade=coluna @ numero:long ... ... ... Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 17 de 78 mapeamento objeto-relacional Mapeamento Mapear objetos significa definir quais são as relações entre as classes e as tabelas e entre as propriedades e colunas ou relacionamentos. Isso pode ser feito via arquivos XML ou via anotações (JSR175). O mapeamento via arquivos XML é o tradicional, desde a versão 0.x do framework. O mapeamento via anotações está disponível para a versão 3+ do framework que opera sobre o Java 1.5. Escolher entre usar XML ou anotações é uma opção do desenvolvedor. Nota-se, porém, que as anotações exigem o download de outro arquivo do Hibernate, o Hibernate Annotations, que nada mais é do que um arquivo JAR a ser colocado no diretório de bibliotecas do sistema. 17
  • 18. www.3layer.com.br O Hibernate e os IDs Uma vez que objetos são recomendados a terem um ID, o Hibernate encarrega-se de gerenciá-los Para isso são usados algoritmos de geração: identity native increment uuid etc. Cada algoritmo tem uma aplicação específica increment não deve ser usado em cluster, por exemplo Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 18 de 78 mapeamento objeto-relacional Identificadores de objetos Embora não seja necessário, é altamente recomenado o uso de idendificadores para os objetos. São as chaves primárias do modelo relacional. Usar chaves primárias otimiza o desempenho do sistema, facilita a localização de objetos e evita problemas de duplicidade de objetos. Uma vez que são utilizados identificadores, o Hibernate pode efetuar a geração dos valores para esses idendificadores. Para isso ele oferece algoritmos de geração diversos. Cada algoritmo tem um uso específico e a escolha correta depende do tipo de aplicação e ambiente de execução. Para maiores informações sobre cada algoritmo de geração, consulte a documentação do Hibernate. 18
  • 19. www.3layer.com.br O modelo OO e o Hibernate O Hibernate suporta completamente o modelo OO do Java, incluindo Associações simples e bidirecionais Coleções Herança Interfaces Tipos de dados nativos e wrappers Objetos simples e compostos Atributos estáticos Enumerações Qualquer tipo definido pelo usuário Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 19 de 78 mapeamento objeto-relacional Hibernate versus Modelo OO Em suma, todo e qualquer estrutura da linguagem Java pode ser persistida, incluindo coleções, enumerações, classes com herança, interfaces, tipos nativos ou wrappers e, obviamente, tipos definidos pelo usuário. 19
  • 20. www.3layer.com.br Associações Unidirecionais A referencia B Bidirecionais A referencia B que referencia A Associação unidirecional Associações bidirecionais esposa Crianca Estado dono bichinho Pessoa Pais pais AnimalDeEstimacao esposo Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 20 de 78 mapeamento objeto-relacional Associações Uma associação é uma ligação entre um objeto e outro. Ela ocorre quando uma classe declara um atributo que é do tipo de outra classe, ambas persistentes. Associações podem ser unidirecionais (somente o objeto que declara a associação – ou principal – tem conhecimento da associação) ou bidirecional (quando ambos objetos têm referências mútuas e, consequentemente, ambos têm conhecimento da associação). Associações auto-associativas quando o atributo declarado é do mesmo tipo da classe declarante, como no exemplo da Pessoa, que possui dois auto-relacionamentos. 20
  • 21. www.3layer.com.br Associações e o modelo relacional Associações são mapeadas para o modelo relacional através de um chave estrangeira na tabela equivalente à classe que declara a associação Associação unidirecional Modelo relacional correspondente Estado Estado Pais id (PK) id (PK) nome nome Pais pais (FK) pais Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 21 de 78 mapeamento objeto-relacional Associações no modelo relacional Associações no modelo relacional são mapeadas para chaves estrangeiras na tabela equivalente à classe que declara a associação, como no exemplo da figura. 21
  • 22. www.3layer.com.br Coleções Um objeto A referencia uma coleção de objetos B Exemplo de coleções Unidirecional Bidirecional estados estados Estado Estado pais Pais Pais Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 22 de 78 mapeamento objeto-relacional Coleções Quando uma classe declara um atributo que referencia um grupo de objetos identicos, diz-se que isso é uma coleção. Da mesma forma que nas associações, as coleções podem ser unidirecionais ou bidirecionais. No exemplo acima, estão ambas situações. Na unidirecional, somente a classe Pais tem conhecimento da relação; já na bidirecional, ambas classes têm conhecimento da relação. 22
  • 23. www.3layer.com.br Coleções e o modelo relacional Coleções podem ser mapeadas através de chaves estrangeiras, ou via tabelas intermediárias Possíveis mapeamentos Via chave estrangeira Coleção bidirecional Estado Pais id (PK) id (PK) estados nome nome Estado pais (FK) pais Pais Via tabela associativa Estado PaisEstado Pais id (PK) paisId (FK) id (PK) nome estadoId (FK) nome Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 23 de 78 mapeamento objeto-relacional Coleções no modelo relacional Coleções são mapeadas para o modelo relacional através de uma chave estrangeira na tabela destino da relação. Por exemplo, sendo a coleção de Estados de um Pais, na tabela equivalente à classe Estado existirá uma chave estrangeira que indica o País a que o Estado pertence. Mesmo para coleções bidirecionais a chave estrangeira basta para dar a informação sobre o objeto principal da relação, no caso o Pais. Esse é o comportamento padrão do Hibernate para o mapeamento de coleções. Deixando o padrão de lado e usando o recomenado Embora o uso de chaves estrangeiras seja suficiente para mapear coleções unidirecionais e bidirecionais, o Hibernate sugere (e recomenda) o uso de uma tabela associativa para resolver a coleção, como na parte de baixo da figura onde existem três tabelas. Nessa configuração, não existem chaves estrangeiras nas tabelas equivalentes às classes envolvidas na coleção. Uma terceira tabela é criada e ela contém as chaves primárias das classes relacionadas. Essas chaves primárias são também chaves estrangeiras que referenciam as tabelas equivalentes aos relacionamentos. Com essa abordagem, é possível efetuar modificações nas coleções (como mudar a cardinalidade de 1-n para n-n) sem a necessidade de ajustes no banco de dados. Além disso, deixa o banco de dados preparado para outras necessidades, como associar dados a itens da coleção. Isso é visto a seguir. 23
  • 24. www.3layer.com.br Relacionamentos múltiplos (n-n) Muitas vezes, os relacionamentos entre as classes podem ter cardinalidade maior que 1, nesse caso: Modelo OO Modelo ER Sem informações por item Sem informações por item alunos Aluno Aluno AlunoDisciplina Disciplina disciplinas id (PK) alunoId (FK) id (PK) nome disciplinaId (FK) nome Disciplina Com informações por item Com informações por item turma Aluno Turma Disciplina Aluno Turma alunos nome (PK) turmas id (PK) id (PK) alunoId (FK) nome nome disciplinas disciplinaId (FK) Disciplina horario Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 24 de 78 mapeamento objeto-relacional Relacionamentos n-n O suporte aos relacionamentos n-n no Hibernate é feito através de tabelas de associação, como no exemplo acima. Sendo um aluno que frequenta várias disciplinas e cada disciplina consistida de vários alunos, constitui-se um relacionamento n-n, onde cada parte da relação compreende uma coleção de objetos. Quando dados devem ser vinculados a itens da coleção, esses são armazenados na tabela associativa. É o caso, por exemplo, da formação de turmas de alunos por disciplina. Nesse caso, define-se já no modelo de objetos o conceito de Turma e, para cada uma, associa-se as informações necessárias, como a nota do aluno. 24
  • 25. www.3layer.com.br Carregamento de dependências Associações e coleções podem ser carregadas de duas formas: Antecipadamente: Quando o objeto principal é carregado, a associação (ou coleção) também o é. Tardiamente: Quando o objeto principal é carregado, a associação (ou coleção) não o é. Carregamento de dependências estados Antecipado Tardio Estado Pais p = (Pais) session.load(Pais.class,123); Pais p = (Pais) session.load(Pais.class,123); //p.getEstados() inicializada //p.getEstados() não inicializada Pais Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 25 de 78 mapeamento objeto-relacional Dependências Quando um objeto recuperado da base de dados possui associações ou coleções, essas podem ou não ser materializadas junto com esse objeto. Quanto as dependências são inicializadas junto ao objeto que as declara, ocorre o chamado carregamento antecipado.. Quanto as dependências não são inicializadas junto ao objeto que as declara, ocorre o chamado carregamento tardio. O comportamento do carregamento das dependências é configurável através da propriedade LAZY, geralmente com valores True ou False (e algumas variações) em cada propriedade da classe. Para associações, o carregamento padrão é tardio com o uso de um proxy gerado em tempo de execução (via instrumentação de código) que inicializa a associação no seu primeiro acesso (chamada do método getter). Para coleções, o carregamento padrão é o tardio. 25
  • 26. www.3layer.com.br Mais sobre coleções Coleções podem ser indexadas ou não Coleções indexadas exigem uma coluna a mais (de ordem) na tabela destino Coleções podem ser ordenadas explicitamente Durante o mapeamento, é possível especificar uma ordem de busca via ORDER BY Coleções podem ter comandos customizados de carregamento O padrão de busca é uma junção entre as tabelas, mas pode ser explicitado um comando diferente Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 26 de 78 mapeamento objeto-relacional Mais coleções Coleções podem ser indexadas. Isso ocorre quando a ordem dos itens da coleção é importante. Nesse caso, uma coluna extra é adicionada na tabela respectiva ao mapeamento. Coleções podem ter uma ordem explícita de retorno, obtida através de uma seleção com a cláusula ORDER BY definida no arquivo de mapeamento. Coleções podem ter uma forma diferente de carregamento. Por padrão, uma junção é feita entre a tabela que representa a classe principal e a tabela que representa a classe do item da coleção. Porém, é possível utilizar um comando HQL customizado para inicialização dessa coleção, ou mesmo SQL e até Stored Procedures para isso. 26
  • 27. www.3layer.com.br Integração com JMX O Hibernate suporta o gerenciamento de serviço através da tecnologia JMX, padrão no Java EE Através dela é possível verificar o estado das sessões de trabalho, da fábrica de sessões, estatíticas de cache, log, etc. Utilitários visuais podem ser encontrados na web, ou construídos conforme a necessidade JMX Console 52ms Min 29ms Max 12ms Avg 4 Erros Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 27 de 78 mapeamento objeto-relacional JMX JMX (Java Management eXtensions) é um padrão Java para gerenciamento e monitoramento de serviços, muito utilizado em containers de aplicações. O Hibernate está preparado para suportar essa tecnologia. Para mais informações sobre JMX consulte http://java.sun.com/javase/6/docs/technotes/guides/jmx/index.html. 27
  • 28. www.3layer.com.br Cache O Hibernate possui um mecanismo robusto de cache para os objetos da aplicação, dividido em dois níveis Esquema de cache do Hibernate Cache de primeiro nível (por sessão) Cache de segundo nível (por serviço) BD Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 28 de 78 mapeamento objeto-relacional Cache O Hibernate conta com um exclusivo sistema de cache de 2 níveis, configurável e plugáve. O cache é utilizado para armazenar, temporária ou indefinidamente, objetos utilizados (persistidos e recuperados) durante o uso da aplicação. Mais detalhes a seguir. 28
  • 29. www.3layer.com.br Cache de primeiro nível O cache de primeiro nível é automático, e seu escopo é a sessão de trabalho Cada objeto persistido ou recuperado durante uma sessão é cacheado e está disponível para todos clientes que acessarem essa mesma sessão Quando a sessão é finalizada, os objetos são liberados Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 29 de 78 mapeamento objeto-relacional Cache de primeiro nível O cache de primeiro nível é transparente e seu escopo é a sessão de trabalho. Isso significa que, enquanto a sessão estiver aberta, todo e qualquer objeto que passar por ela (vindo do ou indo para o BD) será atachado ao cache e é utilizado para evitar acessos desnecessários ao banco de dados. Mesmo quando a sessão de trabalho ocorre sobre um ambiente clusterizado o cache de primeiro nível está disponível. O cache de primeiro nível é o primeiro acessado peo Hibernate e opera exclusivamente em memória. 29
  • 30. www.3layer.com.br Cache de segundo nível O cache de segundo nível é configurável, e seu escopo é variável Objetos e coleções podem ser cacheadas através de várias maneiras, via configuração Diversos engines de cache são suportados: Hashtable, EHCache, SwarmCache, JBoss TreeCache Características diferentes quanto à clusterização, invalidação, suporte à transações, etc. ReadOnly, ReadWrite, nonStrict ReadWrite, Transactional Queries podem, explicitamente, abdicar do cache Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 30 de 78 mapeamento objeto-relacional Cache de segundo nível O cache de segundo nível pode operar em memória e também ser persistido em disco. Graças à sua arquitetura, diferentes engines de cache podem ser utilizadas, cada qual com recursos e performance diferenciados. Um cache de segundo nível é acessado sempre depois do cache de primeiro nível e seu escopo de duração é definido pela configuração. Nele podem existir tanto objetos (grafos) completos como coleções isoladas. O cache de segundo nível pode operar na forma somente leitura (útil para dados imutáveis) como na forma de leitura e escrita, tendo timeouts configuráveis e podendo ser compartilhados e replicados em ambientes clusterizados. Eventualmente, as queries do usuário podem decidir não utilizar o cache de segundo nível (ou seja, o select é feito diretamente na base de dados). Isso é definido via configuração em nível de serviço. 30
  • 31. www.3layer.com.br Cache, um exemplo Configuração do cache de segundo nível Pode ser dada por XML, anotações ou por arquivo externo Configuração básica de um cache usando a engine EhCache Dimensionar os dados no cache é importante, levando em consideração acessos, média de preenchimento dos objetos, memória disponível e tipo de retenção Usando anotações para especificar parâmetros de cache Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 31 de 78 mapeamento objeto-relacional Um exemplo de cache Nessa figura, um exemplo do uso de cache de segundo nível. Nota-se que sua configuração pode ser bem detalhada e ser realizada através de XML ou de anotações sobre a classe ou coleção. IMPORTANTE é o fato que os caches devem ser dimensionados corretamente, levando em consideração aspectos como o tipo de acesso aos objetos, carga de dados, timeout de invalidação e necessidade de persistência em disco. 31
  • 32. www.3layer.com.br Transações Todas as operações executadas no Hibernate são encapsuladas por transações Standalone, transações demarcadas pelo usuário No container, podem ser automatizadas via JTA pelo Servidor de Aplicação Chamada típica em container Modo Standalone Modo gerenciado EJB1 EJB2 EJB3 HIbernate 1. getSession() 1. getSession() 1 2 3 2. beginTransaction() 2. persist() 4 5 3. persist() 6 4. commit() 7 5. closeSession() 8 9 Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 32 de 78 mapeamento objeto-relacional Transações Como dito, todas operações executadas pelo Hibernate são encapsuladas por transações. Na figura à esquerda, o modo Standalone evidencia que é o código do usuário o responsável por demarcar o início e o fim de uma transação. Ao centro, a figura mostra um típico código de persistência em um ambiente gerenciado (dentro de um container Java EE). Nota-se que não existe código de usuário para demarcar a transação. Essa tarefa é realizada automaticamente pelo container Java EE. À direita, a representação gráfica de uma chamada de um cliente para execução de uma transação. O EJB1 é um EJB de fachada que executa uma série de operações sobre outros EJBs que acessam várias vezes o Hibernate (executando possivelmente comandos de persistência e recuperação de objetos). Quando o método principal do EJB de fachada retornar o container detecta que a transação de negócio terminou e então ele confirma a transação do Hibernate. Tudo isso é automático e transparente. Obviamente, o programador pode decidir não usar transações gerenciadas dentro do container, mas isso é uma prática não recomendada. IMPORTANTE salientar que transações não podem ser aninhadas. 32
  • 33. www.3layer.com.br Interceptadores São objetos que podem ser anexados à uma sessão de trabalho e executar ações diversas Útil, para execução de operações administrativas, de segurança e auditoria Utilizando um interceptor para adicionar entradas de log OrdemDeCompra Hibernate BD oc.setNumero(); UPDATE() numero : int oc.setData(); data : Date oc.addItens(); is OrdemDeCompra { itens : List<Item> sess.save(oc); oc.setOperador() operador : String } LogInterceptor onUpdate() Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 33 de 78 mapeamento objeto-relacional Interceptadores Os interceptadores são objetos que executam ações pré-determinadas antes ou depois de um evento na sessão de trabalho. Um uso típico é para cobrir aspectos verticais do sistema, como log e auditoria. No exemplo, o código cliente instancia e salva um objeto sem, porém, informar qual o operador do sistema está fazendo isso. O interceptador captura o evento de salvamentdo desse objeto e insere as informações de log necessárias. O objeto então é persistido no banco de dados. Todo esse funcionamento é transparente para o código cliente. Interceptadores são criados através da implementação da interface org.hibernate.Interceptor. 33
  • 34. www.3layer.com.br Cascateamento de operações Por padrão, nenhuma operação de cascateamento é executada. Porém, isso pode ser alterado, conforme as necessidades da aplicação, sendo: Nenhuma Inclusão Cascateando operações Atualização root SAVE-UPDATE ALL Remoção MERGE Todas a b c d Todas, removendo órfãos NONE Limpeza (de cache) DELETE ALL ALL Fusão (em sessão) g e f ou combinações válidas EVICT ALL, DELETE-ORPHAN Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 34 de 78 mapeamento objeto-relacional Cascateamento de operações Quando um objeto possui dependências, qualquer operação que ocorre sobre esse objeto pode implicar em outras operações nas suas dependências. Por exemplo, ao salvar o objeto NotaFiscal, deseja-se salvar também seus Itens. Por outro lado, ao atualizar um objeto Endereço não é interessante atualizar o objeto Cidade relacionado, uma vez que a cidade já deve estar previamente cadastrada no sistema. Muitas outras situações podem ocorrer e, para cada uma delas o Hibernate habilita ou não o cascateamento dessas operações. 34
  • 35. www.3layer.com.br Herança O Hibernate suporta o mapeamento da herança de três formas: Uma tabela por hierarquia Uma tabela por subclasse Uma tabela por hierarquia Uma tabela por classe concreta SerVivo id | nome | temp | caule | TIPO Hierarquia de classes Uma tabela por subclasse SerVivo id SerVivo Animal Vegetal nome id | nome id (FK) | temp id (FK) | caule Uma tabela por classe concreta Animal Vegetal SerVivo Animal Vegetal temp caule id | nome id | nome | temp id | nome | caule Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 35 de 78 mapeamento objeto-relacional Herança A diferença mais notável entre o modelo OO e o relacional é o suporte à herança, disponível somente para os sistemas orientados a objeto. Estruturas que envolvem herança podem ser mapeadas para o modelo relacional de três formas: 1. Uma tabela por hierarquia. Nesse caso, uma única tabela armazena todos objetos da hierarquia inteira de classes. Isso traduz-se em uma tabela que possui todos as propriedades de todas as classes da hierarquia + um atributo identificador, o qual determina qual o tipo de objeto salvo na linha de registro. Essa configuração exige menor número de tabelas no banco de dados, mas exige que as colunas da tabela permitam valores nulos, sendo que, sempre existirâo entradas nulas quando a árvore se especializar. 2. Uma tabela por subclasse. Cada classe (incluindo a raiz) é mapeada para uma tabela distinta, sendo que, cada tabela, possui colunas referentes aos atributos existentes na classe somente (em outras palavras, os atributos herdados não estâo presentes na tabela). Como consequência, não é obrigatório a existência de entradas nulas na tabela, porém, a recuperação de um objeto exige a junção entre todas as tabelas, desde a raiz até a classe do objeto a ser recuperado. 3. Uma tabela por classe concreta. Nesse caso, cada classe é mapeada para uma tabela e, cada tabela, possui todos os atributos da classe + os atributos herdados. Aqui, não existe obrigatoriedade da nulidade nas colunas e não são necessárias junções entre tabelas para recuperação/persistência de objetos. Entretanto, atributos herdados não podem ser sobreescritos (em outras palavras, o campo nome do SerVivo não pode ser renomeado para outro nas classes derivadas). Embora o Hibernate suporte algumas variações nesse modelo, essa é o processo básico de mapeamento, todo configurável pelos arquivos XML ou anotações. Cabe ao desenvolvedor identificar a melhor solução para cada caso. 35
  • 36. www.3layer.com.br HQL – Conceito O Hibernate possui uma linguagem própria para recuperação dos objetos armazenados na base de dados, é a HQL Não segue nenhuma especificação Mas deu origem a uma: a EJB-QL do Java EE Projetada para ser simples e poderosa Mais direta que o SQL Menos complexa que a OQL Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 36 de 78 mapeamento objeto-relacional HQL – Conceito O framework de persistência Hibernate disponibiliza junto com ele uma linguagem de consulta de objetos. Originalmente projetada para executar buscas na base de dados, na versão 3.0 o suporte a operações de manipulação de dados (Data Manipulation Language – DML) foi adicionado. Embora não siga nenhuma especificação, sua estrutura é muito bem definida, sendo compatível com aplicações desenvolvidas desde as primeiras versões do framework. De tanto sucesso, o HQL acabou tornando-se referência na definição do padrão EJB3-QL, este sim uma linguagem de objetos baseada na especificação Enterprise JavaBeans 3. No tocante à estrutura da linguagem, o HQL foi propositalmente projetado para ser parecido com o SQL, mas suportando o conceito de objetos. Logo à primeira vista nota-se grande semelhança com as estrutruras SQL, como SELECT, FROM e WHERE. Comparado à OQL, o HQL é menos complexo e ao mesmo tempo oferecendo muito mais recursos, como funções padrão e operações diversas. 36
  • 37. www.3layer.com.br HQL – Características Opera sobre o serviço do Hibernate Mapeia seus comandos para SQL nativos, ou seja, os dialetos do BD em uso no momento Vale-se de recursos de cache de primeiro e (opcional) segundo níveis Possui sintaxe semelhante ao SQL, para reduzir a curva de aprendizagem Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 37 de 78 mapeamento objeto-relacional HQL – Características O HQL não é executado diretamente no banco de dados. Ele é executado sobre o serviço do Hibernate. Embora à primeira vista isso pode transparecer como sendo um processo mais lento, uma vez que mais uma camada existe entre a aplicação e o BD, na verdade isso não ocorre. Durante a execução, os comandos HQL são mapeandos para a versão SQL nativa do banco de dados utliizado, ou seja, o dialeto do próprio banco de dados é utilizado. Isso traduz-se em performance, pois estruturas otimizadas de acesso podem ser utilizadas. Além disso, executando sobre o serviço do Hibernate, os comandos HQL podem valer-se das estruturas de cache que o Hibernate utiliza, tanto em primeiro quanto em segundo nível. Caches de primeiro nível são montados e mantidos durante uma sessão de serviço, geralmente uma transação do banco de dados (uma query com subselects se enquadra nesse caso). Caches de segundo nível são criados através da configuração do serviço e replicam em memória (no servidor de aplicação, onde o serviço do Hibernate está sendo executado) os dados existentes nas tabelas do banco de dados. Caches de segundo nível podem ser distribuiídos em cluster de servidores, sendo altamente otimizados (devido estrutura de hashmaps hierárquicos) e seguros. Como o HQL é muito semelhante ao SQL, sua curva de aprendizagem é muito menor que qualquer outra linguagem de consulta de objetos, como o OQL. Isso permite uma maior assimilação do HQL junto a comunidade de desenvolvedores. Além disso, como comentado, o HQL é a base do EJB3-QL, mais um motivo para sua grande aceitação. 37
  • 38. www.3layer.com.br HQL – Características Efetua consulta de objetos ou propriedades Possui suporte à herança (consultas polimórficas) Permite fácil navegação entre associações de objetos Além dos tipos de usuário, opera sobre tipos java nativos ou wrappers String, boolean, Date, etc. Coleções Java e de usuário List, Set, Collection, Map, SortedSet, SortedMap Implementando org.hibernate.usertype.UserCollectionType Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 38 de 78 mapeamento objeto-relacional HQL – Características Embora o HQL seja uma linguagem para consulta de objetos, ele pode ser usado para recuperar estruturas semi- estruturadas, como atributos de objetos. Devido sua característica OO, o suporte a estruturas baseadas em herança é muito facilitada. Consultas polimórficas (ou seja, executadas sobre estruturas com herança) podem ser efetuadas como qualquer outra consulta, sem necessidade de adição de nenhuma palavra-chave adicional ou mesmo execução de junções. Outra característica importante do HQL é o suporte a navegação sobre associações de objetos, usando tão somente o caractere “.” (ponto). Por exemplo, uma declaração como “pessoa.cidade.uf.pais.continente.nome” significa que o comando de busca deve retornar o nome do continente em que a pessoa esta localizada, usando as associações existentes, as quais permitem a navegação desde a pessoa até o continete. Isso funciona para atributos com qualquer visibilidade. Quanto aos tipos de dados suportados, outra vantagem para o HQL. Como ele é projetado especificamente para a linguagem Java, seus tipos de retorno não precisam ser convertidos, pois são tipos nativos da linguagem, com String, boolean e List. 38
  • 39. www.3layer.com.br HQL – Funcionalidades Possui inúmeras funções, como no SQL Agregação SUM AVG MIN MAX COUNT Expressões IN, NOT IN, BETWEEN, IS NULL, IS EMPTY, etc. Estruturas CASE (case ... when ... then ... else ... end) Funções de tempo: current_date(), minute(), etc. Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 39 de 78 mapeamento objeto-relacional HQL – Funcionalidades Entre as funcionalidades do HQL cita-se um grande número de funções, como as presentes no SQL. Exemplos são funções de agregação (SUM, COUNT…) e expressões como NOT IN, IS NULL, etc. Além disso, funções extras são oferecidas, como as temporais. O suporte a estruturas mais complexas, como o CASE estruturado do SQL também está presente. 39
  • 40. www.3layer.com.br HQL – Funcionalidades Mais expressões Qualquer operação definida pelo EJB3-QL substring(), trim(), lower(), upper(), etc. Funções escalares sign(), trunc(), rtrim(), sin(), etc. Funções para coleções size(), minelement(), maxelement(), minindex(), etc. Qualquer variável estática pública do Java Color.RED, com.minhaEmpresa.comum.Sexo.MASCULINO Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 40 de 78 mapeamento objeto-relacional HQL – Funcionalidades Outras funções mais relacionadas com objetos também estão presentes, como operações sobre coleções (o que não existe no SQL), tais como size(). Também, a partir da homologação do EJB3-QL (que tentou chegar mais perto do OQL), funções específicas desse padrão estão presentes, como substring(), trim(), etc. Outra característica do HQL é o suporte direto para qualquer variável estática pública do Java, seja ela da própria API da linguagem ou definida pelo programador. 40
  • 41. www.3layer.com.br HQL – Sintaxe Case insensitive Suporte a ORDER BY GROUP HAVING Subqueries (quando o BD suportar) Junções implícitas pelas associações Cláusula de junção inferida pelas propriedades identificadoras (id) Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 41 de 78 mapeamento objeto-relacional HQL – Sintaxe Quanto a sintaxe, o HQL é case insensitive para as palavras-chaves e funções. Para os tipos de dados (as classes do usuário) o case é sensitive. Outras construções presentes no SQL também são suportadas, como ORDER BY, HAVING, etc. Também o suporte a subqueries (odiada pelos DBA’s) está presente. Como característica mais saliente do HQL está o suporte a junções de forma implícita. Em outras palavras, ao efetuar uma junção entre objetos (join) não é necessário especificar quais colunas devem fazer parte dessa junção. Isso é automaticamente inferido pelo serviço do Hibernate, a partir das estruturas de chaves dos objetos relacionados. 41
  • 42. www.3layer.com.br HQL – Buscas simples Nome do A cláusula pacote da SELECT é classe opcional (opcional) Nome da classe from eg.Cat Retorna um objeto do tipo Cat from Cat Um alias from Cat as cat from Cat cat Formas equivalentes da primeira consulta Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 42 de 78 mapeamento objeto-relacional HQL – Buscas simples A partir daquie, vários exemplos são apresentados, em ordem crescente de complexidade. Nesse exemplo inicial, percebe-se a estrutura da linguagem HQL. A primeira coisa que se nota é que a clausúla SELECT é opcional. Realmente, ele é opcional quando o tipo retornado é um (ou vários) objeto(s). Na claúsula FROM é colocada a origem da consulta. Essa é o nome da classe que deve ter os objetos retornados. Tanto pode ser o nome simples, como o nome completamente qualificado (prefixado pelos pacotes). Ainda percebe-se que é possível definir aliases, ou atalhos para essas classes. Isso é importante, uma vez que os atalhos são usados quando junções devem ser executadas ou mesmo quando das classes devem ser referenciadas dentro de estruturas como WHERE. A definição de aliases pode usar ou não a palavra reservada “as” 42
  • 43. www.3layer.com.br HQL – Mais buscas simples Inúmeras classes Uma classe Outra classe podem ser adicionadas from Formula, Parameter [,…] Cria um produto cartesiano entre as classes. Cada linha possui uma coleção com dois objetos (um Formula e outro Parameter) from Formula as form, Parameter as param Mesma coisa, agora com aliases Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 43 de 78 mapeamento objeto-relacional HQL – Mais buscas Quando várias classes estão presentes na claúsula FROM, um produto cartesiando (MxN) é obtido. Várias classes podem fazer parte do FROM e, inclusive, podem ou não receber aliases. 43
  • 44. www.3layer.com.br HQL – Junções Note o uso do alias para montagem das junções Note que as junções não especificam cláusulas de from Pessoa p ligação inner join p.cidade c left outer join c.uf Cria uma junção interna entre uma pessoa e a cidade que ela reside e o resultado é utilizado em uma junção esquerda com a unidade federativa da cidade Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 44 de 78 mapeamento objeto-relacional HQL – Junções As junções são possíveis entre classes relacionadas no modelo de dados. Quando junções são executadas, é necessário utilizar os aliases na sua montagem, como mostra o exemplo. As junção padrão é o inner join, embora existam também o full join, o right outer join e o left outer join. 44
  • 45. www.3layer.com.br HQL – Mais junções from Pessoa p inner join p.cidade c Note o uso da claúsula WHERE sobre uma left outer join c.uf propriedade de objeto where c.nome = “Porto Alegre” Retorna as pessoas que moram na cidade Porto Alegre, quando c.uf não for igual a null Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 45 de 78 mapeamento objeto-relacional HQL – Mais junções Nesse exemplo, uma junção é especificada e uma cláusula de seleção (WHERE) adicionada, de forma que somente parte dos objetos deva ser retornada. 45
  • 46. www.3layer.com.br HQL – Junções externas Note o produto cartesiano para retornar todas as cidades from Pessoa p inner join p.cidade c full join c.uf where c.nome = “Porto Alegre” Retorna as pessoas que moram na cidade Porto Alegre, mesmo que c.uf seja igual a null Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 46 de 78 mapeamento objeto-relacional HQL – Junções externas Aqui um join completo (full join) é usado, para retornar tanto cidades que possuam UFs quanto as que não possuem. 46
  • 47. www.3layer.com.br HQL – Exemplos simples Tanto propriedades Note que o case é simples como insensitive objetos podem ser retornados selECT c.name, c.age, c.mate Note o uso de From Cat as c variáveis públicas estáticas WheRE c.mate.name = “Missy” (constantes) da API AND c.color = Color.WHITE do Java Retorna o nome e a idade do gato, bem como sua companheira quando esta possuir o nome “Missy” e o pêlo do gato for branco. Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 47 de 78 mapeamento objeto-relacional HQL – Exemplos Nesse exemplo, percebe-se o uso do case insensitive em qualquer palavra-chave do HQL. Quanto ao retorno, nota-se que algumas colunas são tipos primitivos (ou seus wrappers), enquanto que outras são objetos. Isso prova a flexibilidade do HQL. Também percebe-se o uso de variáveis públicas estáticas (constantes), como Color.WHITE. 47
  • 48. www.3layer.com.br HQL – Representação em memória 0 1 2 selECT c.name, c.age, c.mate A mesma From Cat as c consulta de antes WheRE c.mate.name = “Missy” AND c.color = Color.WHITE O resultado em memória c.name (String) c.age (int) c.mate (Cat) Propriedades e 0 Frajola 2 Missy objetos podem Java.util.List residir 1 Belo 3 Missy simultaneamente n … … … no resultado 0 1 2 Java.util.List Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 48 de 78 mapeamento objeto-relacional HQL – Representação em memória dos resultados Esse exemplo é o mesmo do slide anterior. Ele dá uma idéia de como os dados são armazenados na memória quando retornados pelo HQL. Todos os dados retornados pelo HQL são adicionados em objetos do tipo java.util.List. Cada posição dessa lista também é um objeto do tipo java.util.List. Assim, enquanto algumas posições podem conter tipos simples ou wrappers (String, boolean, etc.), outras podem conter objetos inteiros (e mesmo complexos, contendo eles mesmo outra coleções dentro deles). 48
  • 49. www.3layer.com.br HQL – Forçando o carregamento mate Cat 1 mate: Cat kittens: List<Cat> 2 child Palavra reservada 3 grandchild para inicialização de kittens coleções from Cat as cat 1 inner join fetch cat.mate 2 left join fetch cat.kittens child 3 left join fetch child.kittens grandchild Retorna um gato, inicializando as coleções de seus filhos e netos Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 49 de 78 mapeamento objeto-relacional HQL – Explicitando o carregamento de coleções No Hibernate, associações podem ter seus objetos inicializados automaticamente ou não. Inicializá-los automaticamente aumente o overhead do sistema, mas diminui o esforço de programação. Quando as associações não são inicializadas automaticamente, pode-se lançar mão da palavra reservada “fetch”. Ela sinaliza o serviço do Hibernate para ele inicializar a associação, mesmo que inicialmente ela não tenha sido projetada para ser inicializada durante o carregamento do objeto pai. Nesse exemplo percebe-se claramente o uso do alias como forma de executar um auto-relacionamento, buscando dados em segundo nível na estrutura. Aqui, Cat é uma tabela que armazena o nome do gato e sea companheira (esposa) através do auto-relacionamento “mate”. Fetch é usado na primeira junção porque mate não é inicializado automaticamente quando o gato é carregado. Depois de carregado o gato e sua mate, uma junção é feita para encontrar seus filhos (kittens). Como é desejado usar esses filhos em outra junção, é usado um alias “child” para ela. Esse resultado é cruzado novamente com kittens, de forma a obter os netos do gato original. Como são junções esquerdas (left joins), somente registros que não contenham NULL serão retornados. Em outras palavras, a seleção acima somente retorna os gatos que possuem uma mate (esposa) e que tenham filhos que possuam outros filhos. 49
  • 50. www.3layer.com.br HQL – Herança Herança Query polimórfica (herança) SerVivo from SerVivo Retorna todos seres vivos, animais e vejetais from Animal Animal Vegetal Retorna somente seres vivos do tipo Animal from Vegetal as v Retorna somente seres vivos do tipo Vegetal Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 50 de 78 mapeamento objeto-relacional HQL e Herança Quanto à herança, o HQL é muito prático. Dada a estrutura à direita do slide, buscas sobre toda a estrutrua ou somente parte dela podem ser executadas. 50
  • 51. www.3layer.com.br HQL – Herança e SQL O SQL gerado depende da Estrutrura OO implementanção usada na herança, podendo ser: SerVivo HQL: from Animal Animal Vegetal SQL: select sv.id, sv.nome, a.temp from serVivo sv inner join Estrutrura relacional animal a on sv.id = a.id SerVivo Id nome Um possível Animal mapeamento, Id Id <FK> table per subclass temperatura Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 51 de 78 mapeamento objeto-relacional HQL e SQL No tocante ao que ocorre quando uma consulta que utiliza estruturas com herança é executada, esse slide mostra um possível mapeamento para o SQL. Como muitas abordagens podem ser usadas para mapear estrutruras de herança em modelos relacionais, somente uma delas é mostrada. Acima está a estrutura OO com herança e o respectivo mapeamento relacional utilizado. A consulta HQL executada e o respectivo SQL gerado são mostrados. 51
  • 52. www.3layer.com.br HQL – Coleções SELECT p.nome, p.fones FROM Pessoa p join p.fones f WHERE f.codArea = 51 AND size(p.fones) > 3 Seleciona o nome e os telefones da pessoa quando o código de área do telefone for 51 e a pessoa possuir mais de 3 telefones from Cat cat where exists elements(cat.kittens) from Player p where 3 > all elements(p.scores) Usando funções sobre coleções Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 52 de 78 mapeamento objeto-relacional HQL e Coleções Quanto a operações sobre coleções, a HQL é generosa. Inúmeras possibilidades, expressões e construções podem ser feitas. Nesse exemplo estão algumas aplicações de funções sobre coleções, como o size() e o uso de operadores como o “exists” e o “all”. Percebe-se que a própria estrutura da linguagem dispensa comentários sobre o que está sendo buscado com os comandos. 52
  • 53. www.3layer.com.br HQL e SQL HQL: select cust from Product prod, Store store inner join store.customers cust where prod.name = 'widget' and store.location.name in ( 'Melbourne', 'Sydney' ) and prod = all elements(cust.currentOrder.lineItems) SQL: SELECT cust.name, cust.address, cust.phone, cust.id, cust.current_order FROM customers cust, stores store, locations loc, store_customers sc, product prod WHERE prod.name = 'widget' AND store.loc_id = loc.id AND loc.name IN ( 'Melbourne', 'Sydney' ) AND sc.store_id = store.id AND sc.cust_id = cust.id AND prod.id = ALL( SELECT item.prod_id FROM line_items item, orders o WHERE item.order_id = o.id Comandos AND cust.current_order = o.id diferentes, ) mesmo resultado Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 53 de 78 mapeamento objeto-relacional HQL e SQL, uma comparação Como dito, o HQL foi projetado para ser simples e poderodo. Esse slide mostra um exemplo comparativo, onde o mesmo resultado é obtido usando o HQL e o SQL. Note que no SQL é preciso o uso de subqueries para retornar os dados necessários. 53
  • 54. www.3layer.com.br Manipulação de dados A partir da versão 3, o Hibernate suporta também a manipulação de dados (INSERT, UPDATE e DELETE) Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); String hqlUpdate = quot;update Customer c set c.name = :newName where c.name = :oldNamequot;; int updatedEntities = s.createQuery( hqlUpdate ) .setString( quot;newNamequot;, newName ) .setString( quot;oldNamequot;, oldName ) .executeUpdate(); tx.commit(); session.close(); Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 54 de 78 mapeamento objeto-relacional DML – Data Manipulation Language Finalmente, um exemplo de manipulação de dados com HQL. Esse recurso está disponível somente para as versões iguais ou superiores a 3.0 do Hibernate. Sua sintaxe é simples e parecida com o SQL, porém com abordagem OO. Nota-se o uso de parâmetros que são substituídos durante a execução do comando. Ao executar esses comandos sobre o banco de dados, percebe-se que comandos SQL nativos são gerados. Támbém o suporte aos “prepared statements” é executado pelo Hibernate, otimizando múltiplas operações seguidas, uma vez que esses comandos ficam pré-compilados no banco de dados. 54
  • 55. www.3layer.com.br Consultas nativas O Hibernate possui suporte à execução de consultas nativas com mapeamento automático de objetos session.createSQLQuery(quot;SELECT ID, NAME, BIRTHDATE, DOG_ID FROM CATSquot;).addEntity(Cat.class).list(); Retorna uma lista de objetos Cat Carregamento customizado 1 <sql-query name=quot;person personquot;> person <return alias=quot;persquot; class=quot;Personquot; lock-mode=quot;upgradequot;/> SELECT NAME AS {pers.name}, ID AS {pers.id} 3 FROM PERSON 2 WHERE ID=? <class name=quot;Personquot;> from Person p FOR UPDATE <id name=quot;idquot;> </sql-query> <generator class=quot;incrementquot;/> </id> SQL|HQL customizado <property name=quot;namequot; not-null=quot;truequot;/> <loader query-ref=quot;person personquot;/> person </class> Arquivo de mapeamento usando SQL|HQL customizado Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 55 de 78 mapeamento objeto-relacional Consultas em SQL nativo O suporte a execução de queries nativas também é uma funcionalide do Hibernate. Assim, é possível executar consultas diretamente usando o SQL nativo do banco de dados e contar com o suporte de mapeamento automático para os objetos e suas propriedades. Isso pode ser feito diretamente sobre a sessão de trabalho (primeiro exemplo), indicando a query e a classe a ser mapeada. Várias classes e relacionamentos (incluindo coleções podem estar presentes). Outra alternativa é criar uma query nativa e usar ela como padrão no carregamento das classes. Dessa forma, quando executa-se uma query HQL sobre uma classe, a query especificada na configuração é executada, ao invés da query padrão que o Hibernate geraria. 55
  • 56. www.3layer.com.br Consultas por critério Não obstante à HQL, é possível recuperar objetos através de critérios de busca Definindo critérios para busca de objetos Um critério de busca simples Criteria crit = sess.createCriteria(Cat.class); crit.setMaxResults(50); List cats = crit.list(); Um critério de busca um pouco mais complexo List cats = sess.createCriteria(Cat.class) .add( Restrictions.like(quot;namequot;, quot;Fritz%quot;) ) .add( Restrictions.or( Restrictions.eq( quot;agequot;, new Integer(0) ), Restrictions.isNull(quot;agequot;) ) ) .list(); Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 56 de 78 mapeamento objeto-relacional Criterias Além da HQL, o Hibernate suporta a recuperação de objetos através de critérios. Para isso uma API bastante felxível está disponível. Cada critério de busca é traduzido em um comando HQL e então processado. No exemplo da figura, uma pesquisa por critério simples e outra um pouco mais elaborada. Muitas aplicações podem ser construídas somente com o uso dos crítérios, sem HQL. Isso é uma decisão de projeto. Quando utilizados critérios para recuperação de objetos, é necessário alterar o código java e aplicar uma nova compilação no sistema. Quando utilizadas HQL externalizadas (por exemplo, deixar os comandos HQL em um arquivo de propriedades e referenciá-las por nome dentro da aplicação) é possível alterar (diga-se, otimizar) as consultas sem o impacto de uma nova compilação do código cliente. Entretanto, nas modernas IDEs de desenvolvimento, o processo de compilação e deployment é quase transparente ao desenvolvedor. 56
  • 57. www.3layer.com.br Paginação Consultas podem ser paginadas, como abaixo: Registros 0 1 2 3 4 5 n Página Obtendo uma lista do 20o ao 30o gatos domésticos Query q = sess.createQuery(quot;from DomesticCat catquot;); q.setFirstResult(20); q.setMaxResults(10); List cats = q.list(); Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 57 de 78 mapeamento objeto-relacional Paginação Quando somente parte dos dados precisam ser retornados para o cliente, é possível executar uma busca paginada de valores. Isso é interessante quando somente alguns registros devem ser exibidos na camada da apresentação. Além de não onerar o banco de dados com buscas de registros desnecessários, evita a poluição da interface do usuário com objetos que não têm interesse para o caso de uso corrente. 57
  • 58. www.3layer.com.br Rolagem Desde que o driver JDBC suporte, é possível nagevar nos resultados: 0 1 2 3 n Navegação Scroll Criando um scroll de registros Query q = sess.createQuery(quot;select cat.name, cat from DomesticCat cat order by cat.namequot;); ScrollableResults cats = q.scroll(); //código para navegar no scroll cats cats.close(); Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 58 de 78 mapeamento objeto-relacional Rolagem A rolagem de dados permite a navegação na forma de cursores. Desde que o driver JDBC utilizado suporte, é possível navegar não somente para frente, mas também em ambas direções. Além disso, é possível operar a rolagem desconectada, totalmente em memória. Com isso, não são consumidos recursos do banco de dados para a rolagem. 58
  • 59. www.3layer.com.br Mais funcionalidades Para ambientes n camadas, DTOs podem ser gerados automaticamente Retornando e imprimindo DTOs Query query = session .createSQLQuery(quot;SELECT NAME, BIRTHDATE FROM CATSquot;) .setResultTransformer(Transformers.aliasToBean(CatDTO.class)); List dtos = query.list(); session.close(); for (CatDTO c : dtos) { print(c.getName()); print(c.getBirthDate()); } Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 59 de 78 mapeamento objeto-relacional Preenchimento automático de DTOs DTOs (Data Transfer Objects) representam um pattern essencial no desenvolvimento Java EE. Eles são objetos que tramitam entre as camadas da aplicãção, levando dados de granularidade diferente aos existentes nas classes de persistência e objetivando a redução de trafego na camada de rede e o acesso ao banco de dados. Para facilitar o trabalho dos desenvolvedores, o Hibernate disponibiliza métodos específicos para materializar esses objetos, evitando criação de fábricas e intensa conversão de tipos. 59
  • 60. www.3layer.com.br Complementando o Hibernate O pacote do Hibernate é autocontido e funcional, porém, outros dois pacotes fazem parte do projeto Hibernate Annotations Entity Manager Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 60 de 78 mapeamento objeto-relacional Complementando o Hibernate Nos slides a seguir, informações sobre como estender as capacidades do Hibernate. 60
  • 61. www.3layer.com.br Hibernate Annotations Por padrão, todo o processo de mapeamento do Hibernate é feito através de arquivos XML Porém, com o advento da JSR175, anotações Java podem ser usadas para inserir as informações de mapeamento Vantagens Menor número de arquivos Pode ser compilada Desvantagens Necessita recompilação em caso de alterações O que é minimizado pelas modernas IDEs e o uso de ferramentas como o ANT Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 61 de 78 mapeamento objeto-relacional Hibernate Annotations Quando inicialmente projetado, o Hibernate efetuava o mapeamento das classes de persistência somente através de arquivos XML. Embora isso ainda seja suportado, com a introdução da JSR 175 que trata das anotações para a linguagem Java, o Hibernate flexibilizou o processo de mapeamento suportando essa tecnologia. Escolher entre utilizar o mapeamento através de XML ou anotações é uma opção do desenvolvedo, o que depende muito das ferramentas disponíveis no ambiente de trabalho e preferências pessoais. Entre as vantagens do uso das anotações estão o menor número de arquivos a ser gerenciado (pois toda a configuração de mapeamento reside dentro das próprias classes de persistência) e o suporte à validação através do próprio compilador da linguagem. Como principal desvantagem está a necessidade de recompilação das classes de persistência caso alguma modificação na estrutura do mapeamento seja feita. Entretanto, salienta-se que essa é uma operação quase transparente nas modernas IDEs ou com o uso de ferramentas como o ANT. Outra consideração que minimiza essa desvantagem é o fato que geralmente modificações na estrutura do mapeamento causam impacto na semântica do sistema e, por isso, também são necessárias alterações em outras classes, obrigando uma recompilação de qualquer maneira. 61
  • 62. www.3layer.com.br Hibernate Annotations Características Release estável Integração com a JSR220 (Java Persistence API) Agrega extensões úteis Cache Cascateamento outras Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 62 de 78 mapeamento objeto-relacional Características das anotações Embora tenha sido introduzida mais recentemente, a API para suporte às anotações é estável. Além disso, como característica essencial está sua aderência ao padrão JSR 220 que trata da persistência de objetos na linguagem Java. Isso quer dizer que qualquer anotação do padrão JSR 220 é suportada pelo Hibernate Annotations. Não obstante ao suporte ao padrão, as anotações do Hibernate agregam recursos utilíssimos como a configuração de cache, cascateamento de operações e outras. 62
  • 63. www.3layer.com.br Hibernate Annotations Validator Conjunto de anotações que visam: Verificar constraints sobre objetos em memória Incorporar constraints no esquema de dados do BD Exemplos @Length(min,max) @Max(value) @Min(value) @NotNull @Pattern(regex) @Range(min,max) @Email @MinhaConstraint Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 63 de 78 mapeamento objeto-relacional Validação através das anotações Fazendo parte das anotações, uma API de validação está disponível. Assim, é possível definir vários aspectos que visam a integridade nos dados, como tamanhos mínimos e máximos, intervalos válidos para valores, etc. Visando integridade em ambas as camadas do sistema, parte das informações de validação são exportadas para o modelo de dados, como as validações de obrigatoriedade e domínios. Várias validações são nativas do framework, como máscaras de email. Outras, ainda, podem ser definidas livremente pelo usuário e anexadas às classes de persistência. 63
  • 64. www.3layer.com.br Hibernate Annotations Validators, funcionamento Adiciona-se as anotações de validação sobre as propriedades dos objetos Via aplicação cliente Encapsula-se a classe anotada em um ClassValidator Invoca-se getInvalidValues sobre um objeto da classe Exibe-se os resultados, que são i18n Via listeners de sessão (atuam como interceptadores) Configura-se listeners para operações de INSERT ou UPDATE Exceptions em runtime são lançadas, caso haja violação nas constraints Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 64 de 78 mapeamento objeto-relacional Validação em funcionamento Dois são os passos para que o suporte ao Hibernate Validators seja ativado. O primeiro é adicionar as anotações de validação sobre os campos da classe de persistência. O segundo é aplicar a validação. Isso pode ser feito através da chamada de métodos da própria API de validação e é útil quando se deseja efetuar uma validação no cliente antes de enviar os dados para a camada de persistência. A outra opção é adicionar listeners de validação na sessão de trabalho. Esses listener ouvem eventos de inserção e remoção e disparam exceções quando o objeto a ser persistido não satisfazer as cláusulas de validação especificadas. 64
  • 65. www.3layer.com.br Entity Manager Extensão do Hibernate que provê as funcionalidades descritas no padrão JSR220 (EJB3) Na prática, é usado para permitir uma fácil migração do Hibernate para o EJB3 Hibernate x Entity Manager No Hibernate... No Entity Manager... SessionFactory EntityManagerFactory Session EntityManager configuration.xml persistence.xml hibernate.properties Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 65 de 78 mapeamento objeto-relacional Entity Manager Outra extensão valiosa para o Hibernate é o Entity Manager. Esse framework tem por objetivo permitir o uso do Hibernate em ambiente Standalone, de forma que seu uso seja muito parecido com o uso em um ambiente gerenciado. Na prática, seu maior benefício é permitir uma migração suave quando desejar migrar a aplicação para um ambiente gerenciado. Através de uma série de interfaces e classes encapsuladoras, o Hibernate Entity Manager permite que a aplicação cliente opere sobre o Hibernate como se estivesse operando sobre um framework qualquer de mapeamento objeto- relacional. Em outras palavras, quando se usa o Entity Manager, o cliente deve (ou deveria) deixar de usar APIs nativas do Hibernate e utilizar somente a API da JSR 220. É essa característica que torna a migração da aplicação um processo mais fácil. 65
  • 66. www.3layer.com.br Ferramentas O framework Hibernate representa o kernel de um sistema de mapeamento OO-ER Possui, ainda, três ferramentas básicas de trabalho Outras ferramentas também estão disponíveis para facilitar seu uso Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 66 de 78 mapeamento objeto-relacional Ferramentas O framework Hibernate é tudo que se precisa para persistir e recuperar objetos. Porém, o uso de ferramentas facilita operações que são necessárias durante as várias fases do projeto. A seguir, são mostradas as ferramentas mais comuns. 66
  • 67. www.3layer.com.br Geradores integrados SchemaExport Geração da base de dados a partir das classes mapeadas (anotações ou XML) SchemaUpdate Atualização incremental da base de dados a partir das classes mapeadas (anotações ou XML) SchemaValidator Validação das estruturas OO frente ao esquema do banco de dados Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 67 de 78 mapeamento objeto-relacional Ferramentas integradas ao framework O pacote do Hibernate possui três ferramentas integradas, que podem ser acessadas tanto através de linha de comando como através de scritps ANT (a forma recomendada). SchemaExport Utilitário responsável pela geração dos objetos da base de dados a partir das classes de persistência. Na abordagem de desenvolvimento TopDown, ele é muito útil pois pode gerar todo o script de criação do banco de dados. Pode tanto criar os objetos diretamente no banco como gerar um arquivo com o script de criação para ser verficado pelo DBA e posteriormente executado através de uma ferramenta qualquer. SchemaUpdate Responsável pela atualização incremental dos objetos da base de dados. Por atualização incremental entende-se que toda e qualquer adição feita nas classes de persistência (ou mesmo classes novas) são aplicadas na base de dados. Qualquer alteração ou remoção (de classes ou propriedades) nas classes de persistência não são propagadas. Esse comportamento visa evitar a perda de informações (*). Essa ferramenta é útil na abordagem TopDown e está em concordância com os preceitos do modelo incremental e iterativo de desenvolvimento. Seu uso pode ser tanto através da linha de comando, como através do ANT (opção recomendada). SchemaValidator Utilitário auxiliar, que permite obter informações sobre as diferenças existentes entre as classes de persistência mapeadas e o estado atual do banco de dados. Pode ser útil tanto na abordagem TopDown com na BottomUp e é acessado tanto via linha de comando como através do ANT (opção recomendada). OBSERVAÇÕES * Sugere-se para as atualizações sincronias o uso de ferramentas especialistas, tais como o ErWin ou similares. Elas permitem comparação visual de diferenças e a execução de scritps diversos para manter a sincronia entre os objetos da base de dados. 67
  • 68. www.3layer.com.br Integração com o ANT O Apache ANT é uma consagrada ferramenta de construção para Java O Hibernate possui extensões que permitem sua execução via scripts do ANT Gerando o script do banco de dados Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 68 de 78 mapeamento objeto-relacional ANT O Apache ANT é uma ferramenta de construção consagrada para os desenvolvedores Java, permitindo a construção de complexos scritps que podem automatizar muitas etapas do desenvolvimento de software. O Hibernate é projetado para integrar-se ao ANT, sendo seus utililtários acessíveis e configuráveis através de scritps, como o da figura. 68
  • 69. www.3layer.com.br O Hibernate dentro de IDEs Plugins diversos permitem utilizar o Hibernate dentro de IDEs, como o Eclipse O projeto Hibernate Tools (ex Hibern8IDE) é um exemplo que habilita Operação visual Geração automática do arquivo de configuração Console para execução de consultas HQL Previsão dos comandos SQL produzidos Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 69 de 78 mapeamento objeto-relacional O Hibernate dentro de IDEs Para desenvolvedores que utilizam IDEs como o Eclipse, vários plugins estão disponíveis. O mais conhecido é o Hibernate Tools, que permite que várias funções sejam executadas de forma visual e com assistentes de criação. Para desenvolvedores da plataforma Netbeans, o suporte ao padrão JSR220 é uma bota notícia, uma vez que o Hibernate suporta esse padrão. Em outras palavras, as funcionalidades que facilitam o desenvolvimento de aplicações baseadas na Java Persistente API são transparentemente assimiladas pelo Hibernate. NOTA Muitas vezes, as ferramentas visuais são opções produtivas. Porém, não é incomum que desenvolvedores experientes abdiquem dessas ferramentas em pról de scritps ANT. Isso é fato comprovado, principalmente em ambientes grandes, uma vez que a sequência de preenchimento de vários assistentes visuais e configurações manuais é suplantada pela execução rápida e sem erros de vários arquivos de script em lote. Novamente, optar por uma ou outra solução é uma decisão de projeto. 69
  • 70. www.3layer.com.br Hibernate e .NET Desde o ano passado, o Hibernate também está disponível para desenvolvedores .NET, é o NHibernate Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 70 de 78 mapeamento objeto-relacional O Hibernate e o .NET Deslumbrados pelas capacidades do Hibernate na linguagem Java, desenvolvedores da comunidade .NET alavancaram um port para essa plataforma. O Nhibernate é a versão .NET do framework Hibernate e já apresenta um release estável, útil para desenvolvedores Microsoft. 70
  • 71. www.3layer.com.br Dicas para desenvolvimento Utilize abordagem TopDown Pense e modele OO, persista e recupere objetos, não colunas Automatize com ANT Bons scripts valem mais que várias ferramentas Use plugins visuais, mas primeiro entenda o conceito Tenha uma IDE configurada Templates de código são fundamentais Siga as recomendações Pool, gerenciamento de sessões, ajuste fino na configuração, etc. Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 71 de 78 mapeamento objeto-relacional Dicas para desenvolvimento Finalizando essa apresentação, uma série de dicas de desenvolvimento. Essas dicas traduzem o conhecimento adquirido ao longo de vários projetos construídos com o framework Hibernate. Utilize a abordagem TopDown O preceito é simples: modelos OO possuem semântica maior que modelos ER. Partindo desse pressuposto, as ferramentas disponíveis permitem um nível de geração e abstração mais alto no tocante à produção de artefatos de software (modelos, classes, código, etc.). Além disso, técnicas e metodologias novas, como o RUP, XP e Agile Modeling, baseiam-se em modelos iterativos e incrementais, que podem ser transformados e evoluídos mais facilmente com o uso de CASEs. Com base nesses artifícios, uma análise focada em casos de uso e modelagem conceitual, seguida de projeto baseado em prototipação de interfaces, modelos físicos de classes e sequência são elementos fundamentais para essa técnica. A partir deles, é possível desenvolver o projeto tranquilamente, suportando alterações de forma mais fácil. ANT Ferramentas visuais têm seu valor. Principalmente para desenvolvedores novatos e para operações não repetitivas. Por outro lado, ambientes complexos com muitos desenvolvedores e artefatos que precisam ser continuamente refeitos sugerem o uso de ferramentas de automatização. O ANT é uma ferramenta essencial nesse contexto, podem automatizar grande parte dos artefatos necessários no projeto. Conceito como base de tudo Toda ferramenta (visual ou não) é bem vinda para aumentar a produtividade. Porém, antes delas, o desenvolvedor deve entender as bases do que está ocorrendo. Saber fazer manualmente cada operação produzida por uma ferramenta é de suma importância, uma vez que nem sempre todas as possibilidades do framework são contempladas por essas ferramentas. Além disso, é do correto entendimento de aspectos como mapeamento de herança, carregamento de coleções ou semnântica de cache que tornam a aplicação realmente eficaz e eficiente. Seguir as recomendações Muito provavelmente tudo o que você estiver fazendo (ou tendando fazer) já foi feito por alguém antes. Ou melhor, por muitas pessoas. Tanto que, na maioria dos casos, seus problemas já foram bem estudados, documentados e testados e soluções prontas, que representam o estado da arte, já devem estar disponíveis. Assim, nada de reinventar a roda. Antes de fazer, procure a solução ou melhor prática na documentação, em fóruns, etc. Padrões existem para serem seguidos. 71
  • 72. www.3layer.com.br Dicas para desenvolvimento Não reinvente a roda Seja assíduo nos fóruns, leia artigos, estude a API, depure os exemplos, leia os livros Pense OO, mas não esqueça o ER Afinal, os objetos ainda são persistidos em bases relacionais Entenda um pouco mais de BD Indices, sintaxes nativas, normalização, etc. são cruciais para melhorar a performance Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 72 de 78 mapeamento objeto-relacional Dicas para desenvolvimento Continuando... Não reinvente a roda Novamente, ler e pesquisar é a fonte de tudo. Manter-se atualizado em fóruns, listas de discussão, ler (e comentar) artigos, blogs, livros, etc. é a chave para o sucesso. Modelagem e projeto OO, mas dados relacionais A teoria relacional existe há quatro décadas e, matematicamente comprovada, é a solução de armazenamento em disco mais robusta até o momento. Ela está aí hoje e, tal como disse Gavin King – criador do Hibernate, ela deve perdurar por um tempo muito grande ainda. Modelar e projetar OO é uma técnica também mais robusta que a modelagem e projeto em cascata. Entender desses dois mundos é a tarefa do desenvolvedor e saber medir o quanto de cada uma colocar no projeto é seu objetivo diário. Embora quase todos os artefatos do projeto serão (ou estarão) relacionados a objetos, os dados continuarão sendo armazenados em estruturas relacionais. Conhecer mais o banco de dados O simples fato de utilizar um framework de mapeamento objeto-relacional não exime o desenvolvedor de entender o que acontece após a chamada do método save(). Muito pelo contrário. É conhecendo muito bem estruturas como índices, normalização, tabelas temporárias, stored procedures e outras estruturas relacionais que vão tornar a apliação um sistema robusto, escalável, rápido e estável. Modele OO, mas saiba muito bem como seus objetos estarão armazenados no banco de dados. 72
  • 73. www.3layer.com.br Dicas para desenvolvimento Anotações podem ser compiladas, XML não Aprenda HQL, mas não esqueça SQL Verifique o log Analise as estatísticas e afine o sistema Use cache sempre que possível Em ambientes gerenciados, delegue as transações Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 73 de 78 mapeamento objeto-relacional Dicas para desenvolvimento Mais dicas... Anotações Usar anotações dimimui a quantidade de código. HQL e SQL HQL é uma linguagem poderosa, mas em certas situações um comando SQL pode se traduzir em maior performance ou mesmo na única solução disponível. Assim, aprenda HQL, mas conheça (bem) SQL. Log Os logs gerados pelo Hibernate são robustos e podem dar indicativos de comportamento essenciais. Configure-os e use conforme a necessidade. Não em demasia ou por conveniência. Estatísticas Utilizar o Hibernate resolve o problema do mapeamento OO-ER, mas não das más práticas. Assim, observando as estatíticas de uso do sistema, seja através da JMX, de interceptadores, de log ou de análise de cache são tarefas fundamentais para detectar erros, melhorar a performance e diminuir o consumo de memória e recursos do sistema. Cache O cache do Hibernate pode ser essencial em soluções de alta performance. Porém, ele tem custos e implica em alterações na semântica do sistema. Cabe ao projetista e arquiteto escolherem as melhores soluções para cada caso. Transações delegadas Conforme a documentação do Hibernate, nunca tente cuidar das transações por conta própria quando você tiver a facilidade de delegá-las a um servidor de aplicação (como o JBoss). Embora você possa ter benefícios a curto prazo (como a redução do tamanho de uma sessão), quando o sistema crescer ou você adicionar complexidade de negócio ao seu sistema, seu esquema de gerência de transações inicialmente previsto certamente não escalará para a nova situação. 73
  • 74. www.3layer.com.br Comentários finais O Hibernate não carrega dados desnecessários Em outras palavras é a sua configuração está errada! Usar um framework de mapeamento OO-ER não implica em ter um BD desorganizado (sem PKs, FKs, etc.) Operações “pesadas” (ex.: DELETE n-n) podem ser otimizadas, mas com cuidado Usar um framework de mapeamento OO-ER não implica em “vou esquecer que tenho um banco de dados!” Lei do 80/20 (eu diria até 95/5) Nem sempre a HQL e a busca por critérios será suficiente, daí usamos SQL e mapeamento automático Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 74 de 78 mapeamento objeto-relacional Comentários finais Aqui, algumas considerações e respostas à perguntas e conceitos errôneos que já foram levantados contra o Hibernate Somente o que precisa Em nenhum momento o Hibernate trará dados desenecessários. Se isso estiver ocorrendo, com certeza é problema oriundo do mapeamento que você fez ou do código que sua aplicação está executando. Entenda bem o conceito de mapeamento OO-ER e não simplesmente use uma ferramenta sem configuração. Banco de dados organizado É errado pensar que usando um framework como o Hibernate implicará em ter um BD sem estruturas consistentes. Chaves estrangeiras, chaves primárias, campos NOT NULL e outros continuarão existindo. Como experiência a ser dita, pode-se salientar que a partir do uso e do conhecimento de técnicas de mapeamento OO-ER é que acaba conhecendo cada detalhe da estrutura armazenada no banco de dados. Nem sempre a solução do Hibernate é a ótima Às vezes, você precisará escrever um SQL mais avançado, executar uma Stored Procedure ou efetuar comandos de manipulação diretamente na base de dados. Caso típico é a deleção de estruturas N-N (muitos-para-muitos). Nesses casos, é comportamento do Hibernate carregar para a memória ambos os lados da relação e então, depois, remover os links entre os objetos. Em certas situações isso pode ser oneroso e implicar em execução de comandos SQL diretamente nas tabelas envolvidas. Mensusar cada caso e escolher a melhor estratégia a ser seguida é tarefa do projetista e arquiteto. 80/20 Novamente, o bom senso deve ditar os limites da solução proposta. Nem sempre o Hibernate fará uma operação com a melhor performance ou menor quantidade de comandos SQL. Quando o que você precisa não estiver ao alcance dele, efetue suas operações manualmente, via SQL, e depois delegue para o Hibernate a tarefa de materializar os objetos. É errado pensar no “ou tudo, ou nada”. O simples fato de um framework não resolver 100% dos problemas não significa que ele não pode ser usado na grande parte das outras vezes. Tenha isso em mente: se ele resolvesse todos os problemas ele não seria um framework; ele seria a sua aplicação final. 74
  • 75. www.3layer.com.br Espaço comum Participe! Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 75 de 78 mapeamento objeto-relacional Espaço para críticas e sugestões. 75
  • 76. www.3layer.com.br Referências Java Persistence with Hibernate. Bauer, Christian; King, Gavin. Manning, 2007. Hibernate in Action. Bauer, Christian; King, Gavin. Manning, 2005. Hibernate: A J2EE™ Developer's Guide. Iverson, Will. Addison Wesley, 2004. Hibernate Quickly. Peak, Patrick; Heudecker, Nick. Manning, 2006. Hibernate Relational Persistence for Idiomatic Java API. Versão 3.2.1. Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 76 de 78 mapeamento objeto-relacional Referências Aqui, a documentação relacionada ou complementar à esta apresentação. 76
  • 77. www.3layer.com.br Fim Hibernate Uma visão geral sobre o framework padrão de fato para mapeamento objeto-relacional Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 77 de 78 mapeamento objeto-relacional Fim da apresentação. 77
  • 78. www.3layer.com.br Slides Auxiliares A partir daqui, somentes slides auxiliares (figuras, textos, rascunhos, etc.) Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para slide 78 de 78 mapeamento objeto-relacional 78