Hibernate
Mapeamento O/R
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
© LES/PUC-Rio
Hibernate - Arquitetura
Arquitetura - Overview
© LES/PUC-Rio
Hibernate – Classes Persistentes
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)
© LES/PUC-Rio
POJO - Exemplo
© LES/PUC-Rio
POJO - Exemplo
mapeamento
© 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
© 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
© 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/
© 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)
© LES/PUC-Rio
Mapeamento de Identificadores
• Indicação da chave primária
– nome do atributo
– tipo
• Escolha do gerador da Chave
ver classe
© LES/PUC-Rio
Tipos de Geradores de Chave
• increment
• guid
• identity
• native
• sequence
• assigned
• hilo
• select
• seqhilo
• foreign
• uuid
© 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
© 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)
© LES/PUC-Rio
Mapeamento de Relacionamentos
• one-to-one
• many-to-one
• one-to-many
• many-to-many
© LES/PUC-Rio
Mapeamento de Relacionamentos - Exemplo
Unidirecional one-to-many
Bidirecional many-to-many
Unidirecional many-to-one
Unidirecional many-to-one
© LES/PUC-Rio
Mapeamento – many-to-one
• <many-to-one
– name
– class
– column
© LES/PUC-Rio
Modelo relacional
comunidades
atores
id <<PK>>
id <<PK>>
nome
nome
descricao
nascimento
atorID <<FK>>
© LES/PUC-Rio
Mapeamento – one-to-one
© LES/PUC-Rio
Modelo relacional
cadastros
atores
id <<PK>>
id <<FK>>
email
nome
username
nascimento
senha
© 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...
© LES/PUC-Rio
Modelo relacional
papeis
comunidades
id <<PK>>
id <<PK>>
nome
nome
descricao
descricao
atorID <<FK>>
comunidadeID <<FK>>
© LES/PUC-Rio
Mapeamento – List – many-to-many
© LES/PUC-Rio
Mapeamento – many-to-many
© LES/PUC-Rio
Modelo relacional
atores
ator_papel
id <<PK>>
atorID <<FK>>
nome
papelID <<FK>>
nascimento
papeis
id <<PK>>
nome
descricao
comunidadeID <<FK>>
© 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
© LES/PUC-Rio
Tabela por hierarquia
• Precisa determinar um discriminator
© LES/PUC-Rio
Modelo relacional
Ator
id <<PK>>
nome
nascimento
escola
ano
ocupacao
salario
TIPO_DE_ATOR
© LES/PUC-Rio
Tabela por subclasse
© LES/PUC-Rio
Modelo relacional
Estudante
Ator
Trabalhador
atorID <<FK>>
id <<PK>>
atorID <<FK>>
escola
nome
ocupacao
ano
nascimento
salario
© LES/PUC-Rio
Tabela por classe concreta
© LES/PUC-Rio
Modelo relacional
Trabalhador
Estudante
id <<PK>>
id <<PK>>
nome
nome
nascimento
nascimento
ocupacao
escola
salario
ano
© LES/PUC-Rio
Tabela por classe concreta – polimorfismo implicito
© LES/PUC-Rio
Configuração
•
hibernate.properties ou hibernate.cfg.xml
– Driver, localização do banco, senha, mapeamentos, etc.
© LES/PUC-Rio
Resultado
• Um arquivo de mapeamento
por classe persistente
• Um arquivo de configuração
© LES/PUC-Rio
Arquitetura Detalhada
© LES/PUC-Rio
Arquitetura Detalhada
© 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
© LES/PUC-Rio
Arquitetura Detalhada
© 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
© 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
© LES/PUC-Rio
Copiar bibliotecas
• Copiar as bibliotecas necessárias para o funcionamento do
hibernate
© 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
© LES/PUC-Rio
Trabalhando com classes persistentes
SessionFactory
hibernate.cfg.xml
cria
Configuration
save
Session
P1
C1
P2
BANCO
A1
delete
© LES/PUC-Rio
Criando uma Session
• Criando uma SessionFactory
• Criando uma Session
© 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
© 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)
© LES/PUC-Rio
Carregando um objeto
• Pode usar dois comandos
– load
• Lança exceção
– Get
• Retorna nulo
© LES/PUC-Rio
Consultando objetos
• HQL
– Linguagem de consulta orientada a objeto
• Criteria
– Uma API orientada a objeto para busca
• SQL
© LES/PUC-Rio
HQL
© LES/PUC-Rio
Paginação
• Usado para determinar fronteiras no resultado
• Útil para evitar desperdício de memória. Ex.: Google
© LES/PUC-Rio
Externalizando queries
• Queries são declaradas nos mapeamentos
• Não mistura código de consulta com o da aplicação
© LES/PUC-Rio
Criteria API
• Mais próximo de desenvolvedores que não conhecem
linguagens de consulta
© LES/PUC-Rio
Alterando objetos persistentes
© 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
© 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
© 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)
© 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
© 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
© LES/PUC-Rio
Download

Hibernate - (LES) da PUC-Rio