61
Hibernate Mapeamento O/R

Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

Embed Size (px)

Citation preview

Page 1: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

Hibernate

Mapeamento O/R

Page 2: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Hibernate – O que é?

• Ferramenta para mapeamento O/R em Java– Uma das mais difundidas

• Separação entre a aplicação e o acesso ao banco

• Facilidade de uso– Controle de transações

– Independência quanto ao tipo de base de dados

• Consulta de dados– HQL

– Criteria Queries

• Licença LGPL

Page 3: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

Hibernate - Arquitetura

Page 4: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Arquitetura - Overview

Page 5: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

Hibernate – Classes Persistentes

Page 6: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Classes Persistentes

• Implementam entidades lógica do negócio

• POJOs (Plain Old Java Object)

– Construtor padrão

– Possui métodos de acesso – gets/sets (opcional)

• Possui um atributo identificador (opcional)

• Classes não final (recomendado)

Page 7: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

POJO - Exemplo

Page 8: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

POJO - Exemplo

mapeamento

Page 9: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Mapeamento

• Devemos informar ao Hibernate como relacionar o modelo de objetos com o modelo relacional

• Arquivos de mapeamento

– Descrevem como são feitos os mapeamentos

Page 10: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Arquivo de Mapeamento

• Arquivo XML

• Declaração de DTD

– Útil para auto-completion

• Declaração das classes

• Usualmente possuem extensão .hbm.xml

Comunidade.hbm.xml

Page 11: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

XML

• Recomendação da W3C para gerar linguagens de marcação para necessidades especiais

– Separação do conteúdo e da formatação

– Legibilidade tanto por humanos quanto por máquinas

– Possibilidade de criação de tags sem limitação

– Criação de arquivos para validação de estrutura

– Com seu uso pode-se interligar bancos de dados distintos

– Simplicidade

• Referencias

– http://www.w3schools.com/xml/

– http://www.w3.org/XML/

Page 12: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Arquivo de Mapeamento – Ex POJO

• Declaração de classe usando o elemento class

– Indicação do nome da classe

– Indicação do nome da Tabela (opcional)

Page 13: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Mapeamento de Identificadores

• Indicação da chave primária

– nome do atributo

– tipo

• Escolha do gerador da Chave

ver classe

Page 14: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Tipos de Geradores de Chave

• increment

• identity

• sequence

• hilo

• seqhilo

• uuid

• guid

• native

• assigned

• select

• foreign

Page 15: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Mapeamento de Propriedades

• Elemento property

– Indicação de nome e tipo

• Se não explicitar coluna considera o nome da propriedade

ver classe

Page 16: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Mapeamento de Propriedades

• Tipos

– nomes de tipos básicos do Hibernate (integer, string, character, date, timestamp, float, binary, serializable, object, blob).

– nome de tipos básicos Java (int, float, char, java.lang.String, java.util.Date, java.lang.Integer, java.sql.Clob, java.util.Calendar).

– nome de uma classe Java Serializable.

– Se não especificado o Hibernate usa reflexão

• Outras propriedades

– Access (property | field): controla como o Hibernate vai acessar os atributos em tempo de execução (default: property)

– column: nome da coluna na tabela do banco (default: nome do atributo)

– not-null (true | false): determina se a propriedade pode ser nula (default: false)

Page 17: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Mapeamento de Relacionamentos

• one-to-one

• many-to-one

• one-to-many

• many-to-many

Page 18: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Mapeamento de Relacionamentos - Exemplo

Unidirecional one-to-many

Bidirecional many-to-many

Unidirecional many-to-one

Unidirecional many-to-one

Page 19: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Mapeamento – many-to-one

• <many-to-one

– name

– class

– column

Page 20: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Modelo relacional

atores

id <<PK>>

nome

nascimento

comunidades

id <<PK>>

nome

descricao

atorID <<FK>>

Page 21: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Mapeamento – one-to-one

Page 22: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Modelo relacional

atores

id <<FK>>

nome

nascimento

cadastros

id <<PK>>

email

username

senha

Page 23: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Mapeamento – uso de Coleções

• java.util.Set, java.util.Collection, java.util.List, java.util.Map, java.util.SortedSet, java.util.SortedMap...

Page 24: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Modelo relacional

papeis

id <<PK>>

nome

descricao

comunidadeID <<FK>>

comunidades

id <<PK>>

nome

descricao

atorID <<FK>>

Page 25: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Mapeamento – List – many-to-many

Page 26: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Mapeamento – many-to-many

Page 27: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Modelo relacional

atores

id <<PK>>

nome

nascimento

ator_papel

atorID <<FK>>

papelID <<FK>>

papeis

id <<PK>>

nome

descricao

comunidadeID <<FK>>

Page 28: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Mapeamento - Herança

• Estratégia de estrutura genérica não utilizada

• Três estratégias

– Tabela por hierarquia

– Tabela por subclasse

– Tabela por classe concreta

• Recurso

– Polimorfismo implícito

Page 29: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Tabela por hierarquia

• Precisa determinar um discriminator

Page 30: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Modelo relacional

Ator

id <<PK>>

nome

nascimento

escola

ano

ocupacao

salario

TIPO_DE_ATOR

Page 31: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Tabela por subclasse

Page 32: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Modelo relacional

Ator

id <<PK>>

nome

nascimento

Trabalhador

atorID <<FK>>

ocupacao

salario

Estudante

atorID <<FK>>

escola

ano

Page 33: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Tabela por classe concreta

Page 34: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Modelo relacional

Trabalhador

id <<PK>>

nome

nascimento

ocupacao

salario

Estudante

id <<PK>>

nome

nascimento

escola

ano

Page 35: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Tabela por classe concreta – polimorfismo implicito

Page 36: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Configuração

• hibernate.properties ou hibernate.cfg.xml– Driver, localização do banco, senha, mapeamentos, etc.

Page 37: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Resultado

• Um arquivo de mapeamento por classe persistente

• Um arquivo de configuração

Page 38: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Arquitetura Detalhada

Page 39: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Arquitetura Detalhada

Page 40: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

SessionFactory (org.hibernate.SessionFactory)

• Threadsafe

• Montada a partir do arquivo de configuração (hibernate.cfg.xml)

• Fábrica de Session

• Geralmente se usa uma por aplicação

Page 41: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Arquitetura Detalhada

Page 42: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Session (org.hibernate.Session)

• Representa a troca de informações entre a aplicação e um esquema de armazenamento de dados

• Fábrica de transações

• Wrapper para conexões JDBC

• Cache de objetos persistentes

Page 43: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Aplicação Exemplo

• Uma aplicação onde é possível

– Manter atores

• Cadastrar novos

• Editar existentes

– Manter Comunidades

• Cadastrar novas

• Editar existentes

• Adicionar novos papeis

• Gerenciar Papeis

– Consultar atores

– Consultar Comunidades

Modelo

Page 44: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Copiar bibliotecas

• Copiar as bibliotecas necessárias para o funcionamento do hibernate

Page 45: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Criando o banco

• Configuration– Busca o arquivo hibernate.cfg.xml no classpath

• SchemaExport– Classe usada para criar o esquema do banco de dados

• É necessário a existência de um banco com o nome especificado na configuração

Page 46: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Trabalhando com classes persistentes

SessionFactory

Configuration

hibernate.cfg.xml

cria

BANCO

Session

C1

P1

P2

A1

save

delete

Page 47: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Criando uma Session

• Criando uma SessionFactory

• Criando uma Session

Page 48: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Demarcação de transação

• Fronteiras de transação são obrigatórias

• Envolve 4 passos básicos

– iniciar transação

– dar o commit na transação

– tratar erros

– fechar sessão

Page 49: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Tornando um objeto persistente

• Novas instancia são consideradas transientes

• Usa-se o comando save para tornar um objeto persistente

• Ao salvar o seu id é gerado

• Se o objeto contiver associação com outros objetos é preciso salva-los antes (ou usar cascade)

Page 50: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Carregando um objeto

• Pode usar dois comandos

– load

• Lança exceção

– Get

• Retorna nulo

Page 51: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Consultando objetos

• HQL

– Linguagem de consulta orientada a objeto

• Criteria

– Uma API orientada a objeto para busca

• SQL

Page 52: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

HQL

Page 53: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Paginação

• Usado para determinar fronteiras no resultado

• Útil para evitar desperdício de memória. Ex.: Google

Page 54: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Externalizando queries

• Queries são declaradas nos mapeamentos• Não mistura código de consulta com o da aplicação

Page 55: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Criteria API

• Mais próximo de desenvolvedores que não conhecem linguagens de consulta

Page 56: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Alterando objetos persistentes

Page 57: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Tornando os objetos transientes

• Remove o objeto do banco

• Cuidado para não resultar em violação de integridade

• Exemplo: ao remover um ator seu cadastro deve ser removido também

Page 58: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Persistência transitiva

• As operações (save, delete, update) realizadas com o banco podem resultar em perda de integridade

• O Hibernate possui mecanismos para tratar relações do tipo pai/filho automaticamente

• Ex.: Ao remover um ator do banco não faz sentido manter o cadastro do ator

Page 59: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Carga preguiçosa

• Carga dos objetos é feita apenas quando necessário

• Evita sobrecarregar a memória com objetos não necessários

• Hibernate usa proxies das coleções Java

• Pode ser difícil de se trabalhar (LazyInitializationException)

Page 60: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Boas práticas e padrões

• Uso de DAOs (Generic DAOs)

• Patterns

– Session-per-request

• Uma sessão é aberta no inicio de uma requisição e fechada ao final

– Implementada com ServletFilter

• Anti-patters

– Session-per-operation

• Uma sessão é aberta para cada operação executada

Page 61: Hibernate Mapeamento O/R. © LES/PUC-Rio Hibernate – O que é? Ferramenta para mapeamento O/R em Java –Uma das mais difundidas Separação entre a aplicação

© LES/PUC-Rio

Exercícios

• Trabalhar a “auto-didática”– Referência do Hibernate bastante completa:

• http://www.hibernate.org• http://www.hibernate.org/hib_docs/v3/reference/en/html/

• Suponha uma aplicação para fazer o controle de gastos. • Nela seria possível cadastrar entradas de credito ou débito que

determinado indivíduo realizou. • Cada entrada possui um valor, uma data e uma categoria.• Deve ser possível

– Registrar categorias– Verificar quanto foi gasto em determinada categoria em determinado

intervalo de tempo– Verificar qual foi a percentagem que determinada categoria gastou em

determinado intervalo de tempo

• Não se preocupe com– Interface– Controle de usuários