Workshop Hibernate Com Comentarios

78
1 Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional slide 1 de 78 www.3layer.com.br Hibernate Uma visão geral sobre o framework padrão de fato para mapeamento objeto-relacional www.3layer.com.br Autoria e Conteúdo AUTOR: Marcelo Mrack – [email protected]. 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.

description

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.

Transcript of Workshop Hibernate Com Comentarios

Page 1: Workshop Hibernate Com Comentarios

1

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 1 de 78

ww

w.3

laye

r.co

m.b

r

Hibernate Uma visão geral sobre o framework padrão

de fato para mapeamento objeto-relacional

ww

w.3

laye

r.co

m.b

r

Autoria e Conteúdo

AUTOR: Marcelo Mrack – [email protected]. 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.

Page 2: Workshop Hibernate Com Comentarios

2

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 2 de 78

ww

w.3

laye

r.co

m.b

r

Sobre o autor

� Marcelo Mrack, [email protected]� 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

Sobre o autor

Informações sobre o autor do documento e orador.

Page 3: Workshop Hibernate Com Comentarios

3

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 3 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 4: Workshop Hibernate Com Comentarios

4

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 4 de 78

ww

w.3

laye

r.co

m.b

r

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

Hibernate, funcionamento básico

Aplicação Mapeamento Banco de dados

API JDBC

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 segueo 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.

Page 5: Workshop Hibernate Com Comentarios

5

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 5 de 78

ww

w.3

laye

r.co

m.b

r

Degustação

� Um exemplo simples de uso do Hibernate

numero:int...

NotaFiscal

NotaFiscal nf = new NotaFiscal();nf.setNumero(numero);//...outros setters...

Session session = HibernateUtil.getSessionFactory().getCurrentSession();

session.beginTransaction();session.save(nf);session.getTransaction().commit();

Cliente Endereco

Cidade

Estado

Pais

Item

Produto

Estoque

Local

Fornecedor

Produtos

... ... ...

Persistência...

1

23

54

678

910

Session session = HibernateUtil.getSessionFactory().getCurrentSession();

NotaFiscal nf = (NotaFiscal) session.load(NotaFiscal.class, 1001);

Recuperação...1

2

3

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.

Page 6: Workshop Hibernate Com Comentarios

6

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 6 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 7: Workshop Hibernate Com Comentarios

7

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 7 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 8: Workshop Hibernate Com Comentarios

8

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 8 de 78

ww

w.3

laye

r.co

m.b

r

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

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/

Page 9: Workshop Hibernate Com Comentarios

9

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 9 de 78

ww

w.3

laye

r.co

m.b

r

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)

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.

Page 10: Workshop Hibernate Com Comentarios

10

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 10 de 78

ww

w.3

laye

r.co

m.b

r

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)

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.

Page 11: Workshop Hibernate Com Comentarios

11

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 11 de 78

ww

w.3

laye

r.co

m.b

r

Arquitetura

� Arquitetura-base do Hibernate

Hibernate, arquitetura-base

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).

Page 12: Workshop Hibernate Com Comentarios

12

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 12 de 78

ww

w.3

laye

r.co

m.b

r

Arquitetura

� A configuração completa

Hibernate em configuração completa

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.

Page 13: Workshop Hibernate Com Comentarios

13

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 13 de 78

ww

w.3

laye

r.co

m.b

r

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

Hibernate

BD

Aplicação

Hibernate

BD

Container

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.

Page 14: Workshop Hibernate Com Comentarios

14

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 14 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 15: Workshop Hibernate Com Comentarios

15

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 15 de 78

ww

w.3

laye

r.co

m.b

r

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

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!

Page 16: Workshop Hibernate Com Comentarios

16

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 16 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 17: Workshop Hibernate Com Comentarios

17

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 17 de 78

ww

w.3

laye

r.co

m.b

r

O processo de mapeamento

� A configuração do mapeamento OO-ER é feita por classe, através de:� XML

� Anotações (JSR175) (exige pacote extra)

id:longnumero:long...

MinhaClasse

XMLclasse=tabelapropriedade=coluna...

@@@...

Hibernate, mapeamento de classes

Usando anotações

Usando XML

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.

Page 18: Workshop Hibernate Com Comentarios

18

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 18 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 19: Workshop Hibernate Com Comentarios

19

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 19 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 20: Workshop Hibernate Com Comentarios

20

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 20 de 78

ww

w.3

laye

r.co

m.b

r

Associações

� Unidirecionais� A referencia B

� Bidirecionais� A referencia B que referencia A

Estado

Pais

Pessoa

pais esposo

esposaCrianca

AnimalDeEstimacao

bichinhodono

Associação unidirecional Associações bidirecionais

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.

Page 21: Workshop Hibernate Com Comentarios

21

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 21 de 78

ww

w.3

laye

r.co

m.b

r

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

Estado

Paispais

Associação unidirecional

Estado Pais

Modelo relacional correspondente

id (PK)nomepais (FK)

id (PK)nome

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.

Page 22: Workshop Hibernate Com Comentarios

22

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 22 de 78

ww

w.3

laye

r.co

m.b

r

Coleções

� Um objeto A referencia uma coleção de objetos B

Exemplo de coleções

Estado

Pais

estadosEstado

Pais

pais

estados

Unidirecional Bidirecional

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.

Page 23: Workshop Hibernate Com Comentarios

23

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 23 de 78

ww

w.3

laye

r.co

m.b

r

Coleções e o modelo relacional

� Coleções podem ser mapeadas através de chaves estrangeiras, ou via tabelas intermediárias

Coleção bidirecional

Estado

Pais

pais

estados

Estado Pais

Possíveis mapeamentos

id (PK)nomepais (FK)

id (PK)nome

Estado Pais

id (PK)nome

id (PK)nome

PaisEstado

paisId (FK)estadoId (FK)

Via chave estrangeira

Via tabela associativa

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.

Page 24: Workshop Hibernate Com Comentarios

24

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 24 de 78

ww

w.3

laye

r.co

m.b

r

id (PK)nome

id (PK)nome

nome (PK)alunoId (FK)disciplinaId (FK)horario

Relacionamentos múltiplos (n-n)

� Muitas vezes, os relacionamentos entre as classes podem ter cardinalidade maior que 1, nesse caso:

Modelo OO

Aluno

Disciplina

disciplinas

alunosAluno Disciplina

Modelo ER

id (PK)nome

id (PK)nome

AlunoDisciplina

alunoId (FK)disciplinaId (FK)

Aluno DisciplinaTurma

Sem informações por item

Com informações por item

Aluno

Disciplinadisciplinas

turmas

Turmaalunos

turma

Com informações por item

Sem informações por item

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.

Page 25: Workshop Hibernate Com Comentarios

25

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 25 de 78

ww

w.3

laye

r.co

m.b

r

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 é.

Estado

Pais

estados

Carregamento de dependências

AntecipadoPais p = (Pais) session.load(Pais.class,123);//p.getEstados() inicializada

TardioPais p = (Pais) session.load(Pais.class,123);//p.getEstados() não inicializada

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.

Page 26: Workshop Hibernate Com Comentarios

26

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 26 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 27: Workshop Hibernate Com Comentarios

27

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 27 de 78

ww

w.3

laye

r.co

m.b

r

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

MinMaxAvgErros

12ms

52ms

29ms

4

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.

Page 28: Workshop Hibernate Com Comentarios

28

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 28 de 78

ww

w.3

laye

r.co

m.b

r

Cache

� O Hibernate possui um mecanismo robusto de cache para os objetos da aplicação, dividido em dois níveis

BD

Cache de segundo nível(por serviço)

Cache de primeiro nível(por sessão)

Esquema de cache do Hibernate

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.

Page 29: Workshop Hibernate Com Comentarios

29

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 29 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 30: Workshop Hibernate Com Comentarios

30

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 30 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 31: Workshop Hibernate Com Comentarios

31

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 31 de 78

ww

w.3

laye

r.co

m.b

r

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

Usando anotações para especificar parâmetros de cache

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

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.

Page 32: Workshop Hibernate Com Comentarios

32

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 32 de 78

ww

w.3

laye

r.co

m.b

r

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

1. getSession()2. beginTransaction()3. persist()4. commit()5. closeSession()

1. getSession()2. persist()

Modo Standalone Modo gerenciado EJB1 EJB2 EJB3 HIbernate

Chamada típica em container

1 2 34 5

67

89

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.

Page 33: Workshop Hibernate Com Comentarios

33

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 33 de 78

ww

w.3

laye

r.co

m.b

r

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

numero : intdata : Dateitens : List<Item>operador : String

OrdemDeCompra

Utilizando um interceptor para adicionar entradas de log

oc.setNumero();oc.setData();oc.addItens();sess.save(oc);

Hibernate

onUpdate()

LogInterceptor

is OrdemDeCompra {oc.setOperador()

}

BDUPDATE()

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.

Page 34: Workshop Hibernate Com Comentarios

34

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 34 de 78

ww

w.3

laye

r.co

m.b

r

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

� Atualização

� Remoção

� Todas

� Todas, removendo órfãos

� Limpeza (de cache)

� Fusão (em sessão)

� ou combinações válidas

root

b c da

e f

g

ALL

ALL

SAVE-UPDATE

NONEDELETE

ALL

MERGE

EVICTALL, DELETE-ORPHAN

Cascateando operações

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 quea 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.

Page 35: Workshop Hibernate Com Comentarios

35

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 35 de 78

ww

w.3

laye

r.co

m.b

r

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 classe concreta

Animal Vegetal

SerVivo

Hierarquia de classes

idnome

temp caule

Uma tabela por hierarquia

SerVivo

id | nome | temp | caule | TIPO

Uma tabela por subclasse

SerVivo

id | nome

Animal

id (FK) | temp

Vegetal

id (FK) | caule

Uma tabela por classe concreta

SerVivo

id | nome

Animal

id | nome | temp

Vegetal

id | nome | caule

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.

Page 36: Workshop Hibernate Com Comentarios

36

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 36 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 37: Workshop Hibernate Com Comentarios

37

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 37 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 38: Workshop Hibernate Com Comentarios

38

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 38 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 39: Workshop Hibernate Com Comentarios

39

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 39 de 78

ww

w.3

laye

r.co

m.b

r

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.

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.

Page 40: Workshop Hibernate Com Comentarios

40

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 40 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 41: Workshop Hibernate Com Comentarios

41

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 41 de 78

ww

w.3

laye

r.co

m.b

r

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)

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.

Page 42: Workshop Hibernate Com Comentarios

42

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 42 de 78

ww

w.3

laye

r.co

m.b

r

HQL – Buscas simples

� from eg.Cat� Retorna um objeto do tipo Cat

� from Cat

� from Cat as cat

� from Cat cat� Formas equivalentes da primeira consulta

Nome do pacote da

classe (opcional)

Nome da classe

Um alias

A cláusula SELECT éopcional

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”

Page 43: Workshop Hibernate Com Comentarios

43

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 43 de 78

ww

w.3

laye

r.co

m.b

r

HQL – Mais buscas simples

� 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

Uma classe Outra classe

Inúmeras classes podem ser

adicionadas

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.

Page 44: Workshop Hibernate Com Comentarios

44

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 44 de 78

ww

w.3

laye

r.co

m.b

r

HQL – Junções

� from Pessoa pinner 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

Note o uso do alias para montagem das

junções

Note que as junções não especificam cláusulas de

ligação

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.

Page 45: Workshop Hibernate Com Comentarios

45

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 45 de 78

ww

w.3

laye

r.co

m.b

r

HQL – Mais junções

� from Pessoa pinner join p.cidade cleft outer join c.uf

where c.nome = “Porto Alegre”

� Retorna as pessoas que moram na cidade Porto Alegre, quando c.uf não for igual a null

Note o uso da claúsula WHERE sobre uma

propriedade de objeto

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.

Page 46: Workshop Hibernate Com Comentarios

46

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 46 de 78

ww

w.3

laye

r.co

m.b

r

HQL – Junções externas

� from Pessoa pinner join p.cidade cfull 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

Note o produto

cartesiano para retornar todas as

cidades

HQL – Junções externas

Aqui um join completo (full join) é usado, para retornar tanto cidades que possuam UFs quanto as que não possuem.

Page 47: Workshop Hibernate Com Comentarios

47

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 47 de 78

ww

w.3

laye

r.co

m.b

r

HQL – Exemplos simples

� selECT c.name, c.age, c.mateFrom Cat as cWheRE c.mate.name = “Missy”AND c.color = Color.WHITE

� 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.

Note que o case éinsensitive

Tanto propriedades simples como

objetos podem ser retornados

Note o uso de variáveis públicas

estáticas (constantes) da API

do Java

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.

Page 48: Workshop Hibernate Com Comentarios

48

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 48 de 78

ww

w.3

laye

r.co

m.b

r

HQL – Representação em memória

� selECT c.name, c.age, c.mateFrom Cat as cWheRE c.mate.name = “Missy”AND c.color = Color.WHITE

………

Missy3Belo

Missy2Frajola

c.mate (Cat)c.age (int)c.name (String)

0

1

n

0 1 2

Java

.util

.Lis

t

Java.util.List

A mesma

consulta de antes

O resultado em memória

Propriedades e

objetos podem

residir

simultaneamente

no resultado

10 2

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).

Page 49: Workshop Hibernate Com Comentarios

49

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 49 de 78

ww

w.3

laye

r.co

m.b

r

mate: Catkittens: List<Cat>

HQL – Forçando o carregamento

� from Cat as catinner join fetch cat.mateleft join fetch cat.kittens childleft join fetch child.kittens grandchild

� Retorna um gato, inicializando as coleções de seus filhos e netos

Palavra reservada para inicialização de

coleções

Cat

mate

kittens

1

2

3

1

3

child2

grandchild

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.

Page 50: Workshop Hibernate Com Comentarios

50

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 50 de 78

ww

w.3

laye

r.co

m.b

r

HQL – Herança

� Query polimórfica (herança)

� from SerVivo� Retorna todos seres vivos, animais e vejetais

� from Animal� Retorna somente seres vivos do tipo Animal

� from Vegetal as v� Retorna somente seres vivos do tipo Vegetal

Animal Vegetal

SerVivo

Herança

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.

Page 51: Workshop Hibernate Com Comentarios

51

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 51 de 78

ww

w.3

laye

r.co

m.b

r

HQL – Herança e SQL

� O SQL gerado depende da implementanção usada na herança, podendo ser:� HQL:

� from Animal

� SQL:

� select sv.id, sv.nome, a.tempfrom serVivo sv inner joinanimal a on sv.id = a.id

AnimalId

temperatura

SerVivoId

nome

Id <FK>

Um possível mapeamento,

table per subclass

Animal Vegetal

SerVivo

Estrutrura OO

Estrutrura 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.

Page 52: Workshop Hibernate Com Comentarios

52

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 52 de 78

ww

w.3

laye

r.co

m.b

r

HQL – Coleções� SELECT p.nome, p.fones

FROM Pessoa p join p.fones fWHERE f.codArea = 51AND 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 catwhere exists elements(cat.kittens)

� from Player pwhere 3 > all elements(p.scores)

Usando funções

sobre coleções

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.

Page 53: Workshop Hibernate Com Comentarios

53

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 53 de 78

ww

w.3

laye

r.co

m.b

r

HQL e SQL� HQL:

� select custfrom 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_customerssc, 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

AND cust.current_order = o.id)

Comandos diferentes,

mesmo resultado

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.

Page 54: Workshop Hibernate Com Comentarios

54

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 54 de 78

ww

w.3

laye

r.co

m.b

r

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 = "update Customer c set c.name = :newName where c.name = :oldName";

int updatedEntities = s.createQuery( hqlUpdate ).setString( "newName", newName ).setString( "oldName", oldName ).executeUpdate();

tx.commit();session.close();

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.

Page 55: Workshop Hibernate Com Comentarios

55

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 55 de 78

ww

w.3

laye

r.co

m.b

r

Consultas nativas

� O Hibernate possui suporte à execução de consultas nativas com mapeamento automático de objetos

� session.createSQLQuery("SELECT ID, NAME, BIRTHDATE, DOG_ID FROM CATS").addEntity(Cat.class).list();

� Carregamento customizado

Retorna uma lista de objetos Cat

<sql-query name="personpersonpersonperson"><return alias="pers" class="Person" lock-mode="upgrade"/>SELECT NAME AS {pers.name}, ID AS {pers.id}FROM PERSONWHERE ID=?FOR UPDATE

</sql-query>

<class name="Person"><id name="id">

<generator class="increment"/></id><property name="name" not-null="true"/><loader query-ref="personpersonpersonperson"/>

</class>

SQL|HQL customizado

Arquivo de mapeamento usando SQL|HQL customizado

from Person p

1

2

3

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.

Page 56: Workshop Hibernate Com Comentarios

56

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 56 de 78

ww

w.3

laye

r.co

m.b

r

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

Criteria crit = sess.createCriteria(Cat.class);crit.setMaxResults(50);List cats = crit.list();

Um critério de busca simples

Um critério de busca um pouco mais complexoList cats = sess.createCriteria(Cat.class)

.add( Restrictions.like("name", "Fritz%") )

.add( Restrictions.or(Restrictions.eq( "age", new Integer(0) ),Restrictions.isNull("age")

))

.list();

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.

Page 57: Workshop Hibernate Com Comentarios

57

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 57 de 78

ww

w.3

laye

r.co

m.b

r

Paginação

� Consultas podem ser paginadas, como abaixo:

Query q = sess.createQuery("from DomesticCat cat");q.setFirstResult(20);q.setMaxResults(10);List cats = q.list();

Obtendo uma lista do 20o ao 30o gatos domésticos

0 1 2 3 4 5 nRegistros

Página

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.

Page 58: Workshop Hibernate Com Comentarios

58

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 58 de 78

ww

w.3

laye

r.co

m.b

r

Rolagem

� Desde que o driver JDBC suporte, é possível nagevar nos resultados:

Query q = sess.createQuery("select cat.name, cat from DomesticCat cat order by cat.name");

ScrollableResults cats = q.scroll();//código para navegar no scroll catscats.close();

Criando um scroll de registros

0 1 2 3 n

Scroll

Navegação

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.

Page 59: Workshop Hibernate Com Comentarios

59

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 59 de 78

ww

w.3

laye

r.co

m.b

r

Mais funcionalidades

� Para ambientes n camadas, DTOs podem ser gerados automaticamente

Query query = session.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS").setResultTransformer(Transformers.aliasToBean(CatDTO.class));

List dtos = query.list();session.close();for (CatDTO c : dtos) {print(c.getName());print(c.getBirthDate());

}

Retornando e imprimindo DTOs

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.

Page 60: Workshop Hibernate Com Comentarios

60

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 60 de 78

ww

w.3

laye

r.co

m.b

r

Complementando o Hibernate

� O pacote do Hibernate é autocontido e funcional, porém, outros dois pacotes fazem parte do projeto� Hibernate Annotations

� Entity Manager

Complementando o Hibernate

Nos slides a seguir, informações sobre como estender as capacidades do Hibernate.

Page 61: Workshop Hibernate Com Comentarios

61

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 61 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 62: Workshop Hibernate Com Comentarios

62

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 62 de 78

ww

w.3

laye

r.co

m.b

r

Hibernate Annotations

� Características� Release estável

� Integração com a JSR220 (Java Persistence API)

� Agrega extensões úteis� Cache

� Cascateamento

� outras

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.

Page 63: Workshop Hibernate Com Comentarios

63

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 63 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 64: Workshop Hibernate Com Comentarios

64

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 64 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 65: Workshop Hibernate Com Comentarios

65

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 65 de 78

ww

w.3

laye

r.co

m.b

r

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

SessionFactorySession

configuration.xmlhibernate.properties

EntityManagerFactoryEntityManager

persistence.xml

No Hibernate... No Entity Manager...

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.

Page 66: Workshop Hibernate Com Comentarios

66

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 66 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 67: Workshop Hibernate Com Comentarios

67

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 67 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 68: Workshop Hibernate Com Comentarios

68

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 68 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 69: Workshop Hibernate Com Comentarios

69

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 69 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 70: Workshop Hibernate Com Comentarios

70

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 70 de 78

ww

w.3

laye

r.co

m.b

r

Hibernate e .NET

� Desde o ano passado, o Hibernate também estádisponível para desenvolvedores .NET, é o NHibernate

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.

Page 71: Workshop Hibernate Com Comentarios

71

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 71 de 78

ww

w.3

laye

r.co

m.b

r

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.

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.

Page 72: Workshop Hibernate Com Comentarios

72

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 72 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 73: Workshop Hibernate Com Comentarios

73

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 73 de 78

ww

w.3

laye

r.co

m.b

r

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

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.

Page 74: Workshop Hibernate Com Comentarios

74

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 74 de 78

ww

w.3

laye

r.co

m.b

r

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

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 problemasnã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.

Page 75: Workshop Hibernate Com Comentarios

75

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 75 de 78

ww

w.3

laye

r.co

m.b

r

Espaço comum

� Participe!

Espaço para críticas e sugestões.

Page 76: Workshop Hibernate Com Comentarios

76

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 76 de 78

ww

w.3

laye

r.co

m.b

r

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.

Referências

Aqui, a documentação relacionada ou complementar à esta apresentação.

Page 77: Workshop Hibernate Com Comentarios

77

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 77 de 78

ww

w.3

laye

r.co

m.b

r

Fim

Hibernate Uma visão geral sobre o framework padrão

de fato para mapeamento objeto-relacional

Fim da apresentação.

Page 78: Workshop Hibernate Com Comentarios

78

Dezembro de 2006 Hibernate - Uma visão geral sobre o framework padrão De Fato para mapeamento objeto-relacional

slide 78 de 78

ww

w.3

laye

r.co

m.b

r

Slides Auxiliares

� A partir daqui, somentes slides auxiliares (figuras, textos, rascunhos, etc.)